抽象工厂模式

31 阅读3分钟

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())

在这个示例中,我们定义了抽象产品类 AbstractProductAAbstractProductB,以及具体产品类 ConcreteProductA1ConcreteProductA2ConcreteProductB1ConcreteProductB2。同时,我们定义了抽象工厂类 AbstractFactory,以及具体工厂类 ConcreteFactory1ConcreteFactory2。客户端代码通过具体工厂类来创建产品对象,而不需要直接实例化具体的产品类,从而实现了抽象工厂模式。