创建型设计模式-抽象工厂

抽象工厂模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。

产品族和产品等级是抽象工厂模式中的两个重要概念,它们描述了产品之间的关系。
产品族(Product Family):产品族指的是一组相关的、相互依赖的产品集合。这些产品可能是相互关联的,用于完成特定的任务或在特定的环境下工作。比如,在汽车工厂中,不同品牌(奥迪、宝马)的汽车零部件(发动机、轮胎)组成了不同的产品族。这些产品族共享某些相似性,比如它们都是用于组装汽车的零部件。

产品等级(Product Level):产品等级指的是一个产品族中的产品集合。这些产品在某种程度上是相互独立的,但它们又共享一些公共特征。在汽车工厂的例子中,发动机和轮胎属于不同的产品等级,因为它们虽然在不同的系统中工作,但都是汽车的组成部分。
在这里插入图片描述举例来说,一个汽车工厂的例子。假设我们有不同品牌的汽车(比如奥迪和宝马),每个品牌有自己的发动机和轮胎。
首先,我们定义抽象产品类,包括发动机和轮胎:

// 抽象发动机类
interface Engine {
    void design();
}

// 抽象轮胎类
interface Tire {
    void manufacture();
}

然后,我们定义具体的发动机和轮胎类:

// 具体奥迪发动机类
class AudiEngine implements Engine {
    @Override
    public void design() {
        System.out.println("Designing Audi Engine");
    }
}

// 具体奥迪轮胎类
class AudiTire implements Tire {
    @Override
    public void manufacture() {
        System.out.println("Manufacturing Audi Tire");
    }
}

// 具体宝马发动机类
class BMWEngine implements Engine {
    @Override
    public void design() {
        System.out.println("Designing BMW Engine");
    }
}

// 具体宝马轮胎类
class BMWTire implements Tire {
    @Override
    public void manufacture() {
        System.out.println("Manufacturing BMW Tire");
    }
}

接着,定义抽象工厂接口和具体的工厂类:

// 抽象汽车工厂接口
interface CarFactory {
    Engine createEngine();
    Tire createTire();
}

// 具体奥迪汽车工厂
class AudiFactory implements CarFactory {
    @Override
    public Engine createEngine() {
        return new AudiEngine();
    }

    @Override
    public Tire createTire() {
        return new AudiTire();
    }
}

// 具体宝马汽车工厂
class BMWFactory implements CarFactory {
    @Override
    public Engine createEngine() {
        return new BMWEngine();
    }

    @Override
    public Tire createTire() {
        return new BMWTire();
    }
}

最后,在主程序中使用抽象工厂来创建不同品牌汽车的零部件:

public class Main {
    public static void main(String[] args) {
        // 创建奥迪汽车工厂
        CarFactory audiFactory = new AudiFactory();
        Engine audiEngine = audiFactory.createEngine();
        Tire audiTire = audiFactory.createTire();
        
        // 创建宝马汽车工厂
        CarFactory bmwFactory = new BMWFactory();
        Engine bmwEngine = bmwFactory.createEngine();
        Tire bmwTire = bmwFactory.createTire();
        
        // 使用零部件
        audiEngine.design();
        audiTire.manufacture();
        
        bmwEngine.design();
        bmwTire.manufacture();
    }
}

以上展示了如何使用抽象工厂模式创建不同品牌汽车的零部件,其中每个工厂负责生产属于自己品牌的发动机和轮胎。

优点:

  • 一致性:你可以确保同一工厂生成的产品相互匹配。

  • 易于替换产品系列:如果需要更换产品族,只需切换具体工厂即可。这种灵活性使得系统更容易扩展和维护。

  • 符合单一职责原则:每个具体工厂类负责创建一种产品,符合类的职责单一性原则。

  • 遵循开闭原则:抽象工厂模式符合开闭原则,可以轻松地添加新产品族,而无需修改现有代码。

缺点:

  • 复杂性增加:随着产品族和产品等级的增加,抽象工厂模式可能变得更加复杂。这可能导致类的数量增加,使得系统更难以理解和维护。

适用场景:
如果代码需要与多个不同系列的相关产品交互, 但是由于无法提前获取相关信息, 或者出于对未来扩展性的考虑, 你不希望代码基于产品的具体类进行构建, 在这种情况下, 你可以使用抽象工厂

### 抽象工厂模式概述 抽象工厂模式是一种创建型设计模式,其核心在于提供了一种方式来创建一系列相关或相互依赖的对象,而不必指定它们的具体类[^2]。通过这种方式,客户端能够使用统一的接口来获取所需的产品实例,从而降低了系统组件之间的耦合度。 #### 模式的结构与工作原理 该模式主要由四个部分组成: - **抽象工厂(Abstract Factory)**:定义了一个用于创建一具体产品对象的方法集合。 - **具体工厂(Concrete Factory)**:实现了抽象工厂所声明的操作,负责生产特定种类的产品系列。 - **抽象产品(Abstract Product)**:为每一种可能被生产的物品设定了通用接口。 - **具体产品(Concrete Product)**:实际要创建出来的实体类,继承自相应的抽象产品并实现其功能。 当客户请求某个类型的对象时,会调用相应工厂里的方法得到想要的结果;由于整个过程中只涉及到高层模块对于低层模块的引用(即仅知道如何操作抽象级别的成员),因此即使内部逻辑发生变化也不会影响到外部使用者。 #### 应用场景分析 此模式非常适合应用于以下情况: - 当应用程序存在多个可互换的产品线,并希望保持独立性以便于扩展新特性时不破坏现有代码; - 需要在运行期间动态决定应该采用哪一套设计方案来进行构建; - 要求确保同一版本下的各个组成部分始终一致地协同运作。 例如,在图形库中可以根据不同的渲染引擎选择合适的形状绘制器(如OpenGL vs DirectX)。再比如操作系统风格切换工具里根据不同主题调整窗口控件外观等都是很好的例子。 #### Java实现案例展示 下面给出一段简单的Java代码片段用来说明上述概念的应用: ```java // 定义两个层次的产品接口 public interface GUIFactory { Button createButton(); } public interface Button { void paint(); } ``` 接着分别针对Windows和MacOS平台定制化各自的GUI元素: ```java // Windows风格按钮 class WinButton implements Button { public void paint() { System.out.println("Render a button in the Windows style."); } } // MacOS风格按钮 class MacButton implements Button { public void paint() { System.out.println("Render a button in the macOS style."); } } ``` 最后建立对应的工厂类完成最终组装: ```java // 创建适用于Windows系统的UI部件制造者 class WinFactory implements GUIFactory { @Override public Button createButton() { return new WinButton(); } } // 创建适用于macOS系统的UI部件制造者 class MacFactory implements GUIFactory { @Override public Button createButton() { return new MacButton(); } } ``` 这样就可以很容易地根据当前环境配置选取适当的主题样式了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值