抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供一���接口,用于创建一系列相关或相互依赖的对象,而无需指定它们具体的类。这种模式常用于需要创建多个家族产品的场景,比如不同风格的 UI 组件、不同类型的数据库连接等。
- 抽象工厂模式的结构
抽象工厂模式通常包含以下几个角色:
抽象工厂(Abstract Factory):声明创建抽象产品的方法。
具体工厂(Concrete Factory):实现抽象工厂接口,创建具体产品的实例。
抽象产品(Abstract Product):定义产品的接口。
具体产品(Concrete Product):实现抽象产品接口的具体类。
- 抽象工厂模式的 UML 图
plaintext
+----------+----------++---------------------+ | AbstractFactory | +---------------------+ | + create_product_a() | | + create_product_b() | +---------------------+ / \ |
| |
+-------------------+ +-------------------+
| ConcreteFactoryA | | ConcreteFactoryB |
+-------------------+ +-------------------+
| + create_product_a() | | + create_product_a() |
| + create_product_b() | | + create_product_b() |
+-------------------+ +-------------------+
| |
v v
+-------------------+ +-------------------+
| ConcreteProductA1 | | ConcreteProductB1 |
+-------------------+ +-------------------+
| | | |
+-------------------+ +-------------------+ - 抽象工厂模式的实现
以下是一个 Python 中抽象工厂模式的简单示例:
3.1 定义抽象产品
python
from abc import ABC, abstractmethod
class AbstractProductA(ABC):
@abstractmethod
def useful_function_a(self) -> str:
pass
class AbstractProductB(ABC):
@abstractmethod
def useful_function_b(self) -> str:
pass
@abstractmethod
def another_useful_function_b(self, collaborator: AbstractProductA) -> str:
pass
3.2 实现具体产品
python
class ConcreteProductA1(AbstractProductA):
def useful_function_a(self) -> str:
return "Result of ConcreteProductA1"
class ConcreteProductA2(AbstractProductA):
def useful_function_a(self) -> str:
return "Result of ConcreteProductA2"
class ConcreteProductB1(AbstractProductB):
def useful_function_b(self) -> str:
return "Result of ConcreteProductB1"
def another_useful_function_b(self, collaborator: AbstractProductA) -> str:
result = collaborator.useful_function_a()
return f"Result of ConcreteProductB1 collaborating with ({result})"
class ConcreteProductB2(AbstractProductB):
def useful_function_b(self) -> str:
return "Result of ConcreteProductB2"
def another_useful_function_b(self, collaborator: AbstractProductA) -> str:
result = collaborator.useful_function_a()
return f"Result of ConcreteProductB2 collaborating with ({result})"
3.3 定义抽象工厂
python
class AbstractFactory(ABC):
@abstractmethod
def create_product_a(self) -> AbstractProductA:
pass
@abstractmethod
def create_product_b(self) -> AbstractProductB:
pass
3.4 实现具体工厂
python
class ConcreteFactoryA(AbstractFactory):
def create_product_a(self) -> AbstractProductA:
return ConcreteProductA1()
def create_product_b(self) -> AbstractProductB:
return ConcreteProductB1()
class ConcreteFactoryB(AbstractFactory):
def create_product_a(self) -> AbstractProductA:
return ConcreteProductA2()
def create_product_b(self) -> AbstractProductB:
return ConcreteProductB2()
3.5 使用抽象工厂
python
def client_code(factory: AbstractFactory) -> None:
product_a = factory.create_product_a()
product_b = factory.create_product_b()
print(product_b.useful_function_b())
print(product_b.another_useful_function_b(product_a))
if name == "main":
print("Client: Testing client code with the first factory:")
factory_a = ConcreteFactoryA()
client_code(factory_a)
print("\nClient: Testing client code with the second factory:")
factory_b = ConcreteFactoryB()
client_code(factory_b)
- 抽象工厂模式的优缺点
优点
封装性:将产品的创建过程封装在工厂类中,客户端不需要关心具体产品的实现。
易于扩展:可以轻松添加新产品或新的工厂,而不影响现有代码。
适用跨产品族的情况:能够确保产品之间的兼容性,以便同一客户使用同一产品族的产品。
缺点
复杂性:引入了更多的类和层次结构,可能会增加系统的复杂度。
不易理解:对于简单场景,抽象工厂模式可能显得过于复杂。 - 何时使用抽象工厂模式
当系统需要独立于其产品的创建、组合和表示时。
当系统需要使用多个产品族中的产品时。
当产品的变化需要同时改变多个类时。 - 总结
抽象工厂模式是一种强大的设计模式,适合用于需要创建多个相关产品的场景。它通过抽象化产品的创建过程,提高了代码的灵活性和可维护性。在实际开发中,根据需求合理使用抽象工厂模式,有助于构建更加清晰和可扩展的系统。