其他分享
首页 > 其他分享> > 抽象工厂模式

抽象工厂模式

作者:互联网

定义: 围绕一个超级工厂创建其他工厂。该超级工厂能创建其他工厂。接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
在这里插入图片描述

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

抽象工厂提供了一个接口,用于从产品系列的每个类创建对象。只要你的代码通过此接口创建对象,你就不必担心创建与你的应用程序已创建的产品不匹配的错误产品变体。

缺点: 产品族扩展非常困难,要添加某一产品族的产品时,需要修改和添加的地方较多。

使用场景: 类具有一组模糊其主要职责的工厂方法时,请考虑实现抽象工厂。在设计良好的程序中,每个类只负责一件事。当一个类处理多种产品类型时,将其工厂方法提取到独立的工厂类或成熟的抽象工厂实现中可能是值得的。

1.创建接口:

public interface Color {
    /**
     * 填充演色
     */
    void fill();
}
/**
 * 形状
 */
public interface Shape {
    /**
     * 画图形
     */
    void draw();
}

2.实现接口

@Slf4j
public class Red implements Color{
    @Override
    public void fill() {
        log.info("调用了Red的fill方法,填充了红色...");
    }
}

@Slf4j
public class Blue implements Color{
    @Override
    public void fill() {
        log.info("调用了Blue的fill方法,填充了蓝色...");
    }
}

@Slf4j
public class Yellow implements Color{
    @Override
    public void fill() {
        log.info("调用了Yellow的fill方法,填充了黄色...");
    }
}

@Slf4j
public class Circle implements Shape{
    @Override
    public void draw() {
        log.info("调用了Circle的draw方法,画了一个圆形...");
    }
}

@Slf4j
public class Triangle implements Shape{
    @Override
    public void draw() {
        log.info("调用了Triangle的draw方法,画了一个三角形...");
    }
}
@Slf4j
public class Rectangle implements Shape{
    @Override
    public void draw() {
        log.info("调用了Rectangle的draw方法,画了一个矩形...");
    }
}

3.创建抽象工厂

public abstract class AbstractFactory {
    /**
     * 填充颜色
     * @param color
     * @return
     */
    public abstract Color getColor(String color);

    /**
     * 画图形
     * @param shape
     * @return
     */
    public abstract Shape getShape(String shape) ;
}

4.创建具体工厂

public class ColorFactory extends AbstractFactory {

    @Override
    public Shape getShape(String shapeType){
        return null;
    }

    @Override
    public Color getColor(String color) {
        if(color == null){
            return null;
        }
        if(color.equalsIgnoreCase("RED")){
            return new Red();
        } else if(color.equalsIgnoreCase("YELLOW")){
            return new Yellow();
        } else if(color.equalsIgnoreCase("BLUE")){
            return new Blue();
        }
        return null;
    }
}

public class ShapeFactory extends AbstractFactory {

    @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("TRIANGLE")){
            return new Triangle();
        }
        return null;
    }

    @Override
    public Color getColor(String color) {
        return null;
    }
}

5.创建超级工厂

public class ShapeFactory extends AbstractFactory {

    @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("TRIANGLE")){
            return new Triangle();
        }
        return null;
    }

    @Override
    public Color getColor(String color) {
        return null;
    }
}

6.创建客户端调用

public class ClientTest {
    public static void main(String[] args) {
        // 获取图形工厂
        AbstractFactory shapeFactory = FactoryOwner.getFactory("SHAPE");
        // 获取形状为 Triangle 的对象
        Shape shape = shapeFactory.getShape("TRIANGLE");
        // 调用 Triangle 的 draw 方法
        shape.draw();
        // 获取颜色工厂
        AbstractFactory colorFactory = FactoryOwner.getFactory("COLOR");
        // 获取颜色为 Yellow 的对象
        Color color = colorFactory.getColor("YELLOW");
        // 调用 Yellow 的 fill 方法
        color.fill();

    }
}

运行结果
-----------------------
调用了Triangle的draw方法,画了一个三角形...
调用了Yellow的fill方法,填充了黄色...

标签:return,shapeType,color,模式,工厂,抽象,Override,null,public
来源: https://blog.csdn.net/weixin_49352973/article/details/120471120