抽象工厂模式(Abstract Factory)详解
1. 概述
抽象工厂模式是一种创建型设计模式,它提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们具体的类。抽象工厂模式通常用于需要创建多个相关对象的场景,尤其是在产品族之间存在一定的关系时。
1.1 适用场景
- 当系统需要独立于其产品的创建、组合和表示时。
- 当系统要使用多个系列的产品,而不需要指定具体的产品类时。
- 当产品的具体类在运行时决定时。
2. 结构
抽象工厂模式的结构通常包括以下几个角色:
- 抽象工厂(AbstractFactory):声明创建抽象产品对象的接口。
- 具体工厂(ConcreteFactory):实现抽象工厂的接口,负责创建具体产品对象。
- 抽象产品(AbstractProduct):声明产品的接口。
- 具体产品(ConcreteProduct):实现抽象产品的接口,定义具体的产品对象。
2.1 UML 类图
+------------------+
| AbstractFactory |
+------------------+
| +createProductA()|
| +createProductB()|
+------------------+
^
|
+------------------+
| ConcreteFactory1 |
+------------------+
| +createProductA()|
| +createProductB()|
+------------------+
^
|
+------------------+
| ConcreteFactory2 |
+------------------+
| +createProductA()|
| +createProductB()|
+------------------+
3. 示例代码
下面是一个简单的抽象工厂模式的示例,展示如何创建不同类型的家具(椅子和沙发)。
3.1 抽象产品
from abc import ABC, abstractmethod
# 抽象产品A
class Chair(ABC):
@abstractmethod
def sit_on(self):
pass
# 抽象产品B
class Sofa(ABC):
@abstractmethod
def lie_on(self):
pass
3.2 具体产品
# 具体产品A1
class ModernChair(Chair):
def sit_on(self):
return "Sitting on a modern chair."
# 具体产品A2
class VictorianChair(Chair):
def sit_on(self):
return "Sitting on a Victorian chair."
# 具体产品B1
class ModernSofa(Sofa):
def lie_on(self):
return "Lying on a modern sofa."
# 具体产品B2
class VictorianSofa(Sofa):
def lie_on(self):
return "Lying on a Victorian sofa."
3.3 抽象工厂
# 抽象工厂
class FurnitureFactory(ABC):
@abstractmethod
def create_chair(self) -> Chair:
pass
@abstractmethod
def create_sofa(self) -> Sofa:
pass
3.4 具体工厂
# 具体工厂1
class ModernFurnitureFactory(FurnitureFactory):
def create_chair(self) -> Chair:
return ModernChair()
def create_sofa(self) -> Sofa:
return ModernSofa()
# 具体工厂2
class VictorianFurnitureFactory(FurnitureFactory):
def create_chair(self) -> Chair:
return VictorianChair()
def create_sofa(self) -> Sofa:
return VictorianSofa()
3.5 客户端代码
def client_code(factory: FurnitureFactory):
chair = factory.create_chair()
sofa = factory.create_sofa()
print(chair.sit_on())
print(sofa.lie_on())
# 使用现代家具工厂
print("Modern Furniture:")
modern_factory = ModernFurnitureFactory()
client_code(modern_factory)
# 使用维多利亚家具工厂
print("\nVictorian Furniture:")
victorian_factory = VictorianFurnitureFactory()
client_code(victorian_factory)
4. 优点与缺点
4.1 优点
- 解耦:抽象工厂模式将产品的创建与使用分离,使得系统更具灵活性和可扩展性。
- 一致性:可以确保同一系列的产品在一起使用,避免了不兼容的产品组合。
- 易于扩展:添加新产品系列时,只需添加新的具体工厂和产品类,而不需要修改现有代码。
4.2 缺点
- 复杂性:引入了多个类和接口,增加了系统的复杂性。
- 难以支持新产品:如果需要添加新产品,可能需要修改抽象工厂的接口,影响到所有的具体工厂。
5. 注意事项
- 在使用抽象工厂模式时,确保产品之间的关系是合理的,避免创建不必要的复杂性。
- 适当使用工厂方法模式与抽象工厂模式的组合,以便在需要时提供更大的灵活性。
- 在设计时,考虑到未来可能的扩展,尽量保持接口的简洁性和一致性。
6. 总结
抽象工厂模式是一种强大的设计模式,适用于需要创建一系列相关产品的场景。通过将产品的创建与使用分离,抽象工厂模式提供了更高的灵活性和可扩展性。然而,设计时需要注意复杂性和扩展性的问题,以确保系统的可维护性。通过合理的设计和使用,抽象工厂模式可以极大地提高代码的质量和可读性。