抽象工厂模式也是一种创建型设计模式,它提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。它特别适合在需要创建多个相关对象且这些对象在逻辑上属于一个“产品族”时使用。
结构:
- 抽象产品:定义了产品家族中每个产品的接口。
- 具体产品:实现抽象产品接口的具体类。
- 抽象工厂:声明了创建一系列相关产品的方法。
- 具体工厂:实现抽象工厂接口,提供具体产品的实例。
实现方式:
python">from abc import ABC, abstractmethod# 抽象产品类
class Chair(ABC):@abstractmethoddef sit_on(self):passclass Sofa(ABC):@abstractmethoddef lie_on(self):pass# 具体产品类
class VictorianChair(Chair):def sit_on(self):return "Sitting on a Victorian Chair."class ModernChair(Chair):def sit_on(self):return "Sitting on a Modern Chair."class VictorianSofa(Sofa):def lie_on(self):return "Lying on a Victorian Sofa."class ModernSofa(Sofa):def lie_on(self):return "Lying on a Modern Sofa."# 抽象工厂类
class FurnitureFactory(ABC):@abstractmethoddef create_chair(self):pass@abstractmethoddef create_sofa(self):pass# 具体工厂类
class VictorianFurnitureFactory(FurnitureFactory):def create_chair(self):return VictorianChair()def create_sofa(self):return VictorianSofa()class ModernFurnitureFactory(FurnitureFactory):def create_chair(self):return ModernChair()def create_sofa(self):return ModernSofa()# 使用示例
factory = VictorianFurnitureFactory()
chair = factory.create_chair()
sofa = factory.create_sofa()
print(chair.sit_on()) # 输出 "Sitting on a Victorian Chair."
print(sofa.lie_on()) # 输出 "Lying on a Victorian Sofa."
优点:
- 一致性:确保同一产品族的对象之间可以协作。
- 解耦:客户端代码与具体类解耦,使得代码更灵活和易于维护。
- 符合开闭原则:添加新的产品族时,只需添加新的具体工厂类即可,无需修改已有代码。
缺点:
- 复杂性增加:需要为每个产品族定义新的具体工厂,类的数量会显著增加。
- 扩展困难:增加新的产品接口(如添加
Table
)需要修改所有的工厂接口及其实现。
适用场景:
- 系统需要创建一系列相关的产品对象,而这些对象在逻辑上属于一个产品族。
- 系统希望提供产品族的多个变体,但保证客户端只使用同一变体的对象。
抽象工厂模式 vs. 简单工厂模式 vs. 工厂方法模式
-
简单工厂模式:
- 创建对象方式:通过一个工厂类的静态方法根据输入创建对象。
- 优点:实现简单,易于使用。
- 缺点:不符合开闭原则,扩展性差。
- 适用场景:适合创建少量、简单对象的场景。
-
工厂方法模式:
- 创建对象方式:通过子类实现的工厂方法创建具体对象。
- 优点:符合开闭原则,每新增产品只需扩展具体工厂类。
- 缺点:增加了实现复杂度和类的数量。
- 适用场景:适合创建多种对象,且需要易于扩展的场景。
-
- 创建对象方式:通过具体工厂创建一系列相关或相互依赖的对象。
- 优点:能够保证同一产品族对象的协作一致性,符合开闭原则。
- 缺点:实现复杂,扩展产品结构较困难。
- 适用场景:适合需要创建一系列相关对象的场景,确保产品之间的一致性。
总结对比:
- 简单工厂模式更适合简单和小规模的对象创建需求,缺乏扩展性。
- 工厂方法模式提供了更高的灵活性,允许创建不同类型的对象,但实现上增加了类的复杂度。
- 抽象工厂模式适合复杂系统中需要创建多个相关产品族的场景,保障产品族内对象的一致性,尽管它在实现上最为复杂。