抽象工厂模式

这篇博客介绍了抽象工厂模式的应用,通过创建抽象工厂和具体工厂来生成不同类型的图形(如圆形、三角形、矩形)和颜色(如红色、黄色、蓝色)。这个模式确保客户端在一组相关的产品族中正确地创建对象,同时也揭示了产品族扩展的局限性。在客户端代码中,通过超级工厂获取所需的图形和颜色对象,实现了代码的灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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

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

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方法,填充了黄色...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值