设计模式-抽象工厂

抽象工厂

定义:用一个超级工厂创建其他工厂,每个生成的工厂都能跟简单工厂一样创建对象。他与工厂方法不同的是:有一系列创建抽象产品的方法,而不是一个。

使用场景:需要生产的产品多于一个产品类型,而系统只使用其中一种产品类型。

1,首先从简单工厂进化到工厂方法,是因为工厂方法弥补了简单工厂对修改开放的弊端,即简单工厂违背了开闭原则。

2,从工厂方法进化到抽象工厂,是因为抽象工厂弥补了工厂方法只能创造一个系列的产品的弊端。

代码示例:

public abstract class AbstractFactory {

    public abstract Shape getShape(String shapeType);

    public abstract Color getColor(String colorType);
}
public interface Color {

    void fill();
}
public interface Shape {

    void draw();
}
public class ColorFactory extends AbstractFactory{
    @Override
    public Shape getShape(String shapeType) {
        return null;
    }

    @Override
    public Color getColor(String colorType) {
        if(colorType.equalsIgnoreCase("red")){
            return new Red();
        }
        return null;
    }
}
public class ShapeFactory extends AbstractFactory {

    @Override
    public Shape getShape(String shapeType) {
        if(shapeType==null){
            return null;
        }else if("CIRCLE".equalsIgnoreCase(shapeType)){
            return new Circle();
        }else if("SQUARE".equalsIgnoreCase(shapeType)){
            return new Square();
        }else if("RECTANGLE".equalsIgnoreCase(shapeType)){
            return new Rectangle();
        }
        return null;
    }

    @Override
    public Color getColor(String colorType) {
        return null;
    }
}
public class Red implements Color {
    @Override
    public void fill() {
        System.out.println("填充红色");
    }
}
public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("我会画");
    }
}
public class FactoryProducer {

    public static AbstractFactory getFactory(String type){
        if(type.equalsIgnoreCase("shape")){
            return new ShapeFactory();
        }else if(type.equalsIgnoreCase("color")){
            return new ColorFactory();
        }
        return null;
    }
}

测试方法:

public class ParteenDemo {

    public static void main(String[] args) {
        AbstractFactory colorFactory = FactoryProducer.getFactory("color");
        Color color = colorFactory.getColor("red");
        color.fill();

        AbstractFactory shapeFactory = FactoryProducer.getFactory("shape");
        Shape circle = shapeFactory.getShape("circle");
        circle.draw();
    }
}
posted @ 2021-06-26 18:22  女友在高考  阅读(62)  评论(0编辑  收藏  举报