抽象工厂设计模式

何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。

如何解决:在一个产品族里面,定义多个产品。

优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。

附上图,便于理解,图来自菜鸟教程

抽象工厂模式的 UML 图

形状接口
//形状接口
public interface Shape {
    void draw();
}
//矩形类
class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("矩形");
    }
}
//正方形类
class Square implements Shape {
    @Override
    public void draw() {
        System.out.println("正方形");
    }
}
//圆类
class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("圆");
    }
}
//颜色接口
interface Color {
    void fill();
}
//红色类
class Red implements Color {
    @Override
    public void fill() {
        System.out.println("红色");
    }
}
//绿色类
class Green implements Color {
    @Override
    public void fill() {
        System.out.println("绿色");
    }
}
//为Color和Shape对象创建抽象类来获取工厂。
abstract class AbstractCreateFactory{
    public abstract Color getColor(String color);
    public abstract Shape getShape(String shape) ;
}
//得到形状和颜色的工厂类
//得到形状和颜色的工厂类
class CreateFactory extends AbstractCreateFactory{

    @Override
    public  Color getColor(String color) {
        if(color==null){
            return null;
        }
        if(color.equalsIgnoreCase("RED")){
            return new Red();
        } else if(color.equalsIgnoreCase("GREEN")){
            return new Green();
        }
        return null;
    }

    @Override
    public Shape getShape(String shapeType) {
        if(shapeType==null){
            return null;
        }
        if(shapeType.equalsIgnoreCase("CIRCLE")){
            return new Circle();
        } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
            return new Rectangle();
        } else if(shapeType.equalsIgnoreCase("SQUARE")){
            return new Square();
        }
        return null;
    }
}
//创建一个生成器
class FactoryProducer{
    public static AbstractCreateFactory getFactory(){
        return new CreateFactory();
    }
}
//测试类
class Test1{
    public static void main(String[] args) {
        Shape circle = FactoryProducer.getFactory().getShape("CIRCLE");
        circle.draw();
        Color red = FactoryProducer.getFactory().getColor("RED");
        red.fill();
    }
}

 

posted @ 2019-08-08 20:10  沦为旧友  阅读(157)  评论(0编辑  收藏  举报