1. 抽象工厂模式简介
一句话介绍:抽象工厂模式是一种创建型设计模式,它提供一个接口用于创建一系列相关或依赖对象的家族,而不需要指定具体类。
2. 详细介绍
抽象工厂模式包含抽象工厂和具体工厂两个层次结构。抽象工厂定义了一系列工厂方法,用于创建一系列相关的产品对象。每个具体工厂都实现了抽象工厂中定义的工厂方法,以创建具体的产品对象。这样,客户端代码可以通过抽象工厂来创建一系列相关的产品,而不需要关心具体的实现细节。
3. 使用场景以及优缺点
使用场景:
- 当系统需要一系列相关的产品对象,并且希望避免客户端代码依赖具体的产品类时,可以使用抽象工厂模式。
- 当系统需要跨多个产品家族进行配置时,可以使用抽象工厂模式。
优点:
- 抽象工厂模式将产品的创建过程与客户端代码分离,使得客户端代码更加灵活,易于扩展和维护。
- 抽象工厂模式符合开闭原则,新增产品类时无需修改现有代码,只需要增加相应的具体工厂类即可。
缺点:
- 当需要添加新的产品时,除了需要新增产品类外,还需要修改抽象工厂接口及其所有的具体工厂类,这增加了系统的复杂度。
4. 使用Python实现
下面是使用Python实现抽象工厂模式的简单示例:
from abc import ABC, abstractmethod
# 抽象产品A
class AbstractProductA(ABC):
@abstractmethod
def do_something(self):
pass
# 具体产品A1
class ConcreteProductA1(AbstractProductA):
def do_something(self):
return "具体产品A1的操作"
# 具体产品A2
class ConcreteProductA2(AbstractProductA):
def do_something(self):
return "具体产品A2的操作"
# 抽象产品B
class AbstractProductB(ABC):
@abstractmethod
def do_something(self):
pass
# 具体产品B1
class ConcreteProductB1(AbstractProductB):
def do_something(self):
return "具体产品B1的操作"
# 具体产品B2
class ConcreteProductB2(AbstractProductB):
def do_something(self):
return "具体产品B2的操作"
# 抽象工厂
class AbstractFactory(ABC):
@abstractmethod
def create_product_a(self) -> AbstractProductA:
pass
@abstractmethod
def create_product_b(self) -> AbstractProductB:
pass
# 具体工厂1
class ConcreteFactory1(AbstractFactory):
def create_product_a(self) -> AbstractProductA:
return ConcreteProductA1()
def create_product_b(self) -> AbstractProductB:
return ConcreteProductB1()
# 具体工厂2
class ConcreteFactory2(AbstractFactory):
def create_product_a(self) -> AbstractProductA:
return ConcreteProductA2()
def create_product_b(self) -> AbstractProductB:
return ConcreteProductB2()
# 客户端代码
if __name__ == "__main__":
# 使用具体工厂1创建产品
factory1 = ConcreteFactory1()
product_a1 = factory1.create_product_a()
product_b1 = factory1.create_product_b()
print(product_a1.do_something())
print(product_b1.do_something())
# 使用具体工厂2创建产品
factory2 = ConcreteFactory2()
product_a2 = factory2.create_product_a()
product_b2 = factory2.create_product_b()
print(product_a2.do_something())
print(product_b2.do_something())
在这个示例中,我们定义了抽象产品类 AbstractProductA 和 AbstractProductB,以及具体产品类 ConcreteProductA1、ConcreteProductA2、ConcreteProductB1 和 ConcreteProductB2。同时,我们定义了抽象工厂类 AbstractFactory,以及具体工厂类 ConcreteFactory1 和 ConcreteFactory2。客户端代码通过具体工厂类来创建产品对象,而不需要直接实例化具体的产品类,从而实现了抽象工厂模式。