📜  设计模式-抽象工厂模式(1)

📅  最后修改于: 2023-12-03 15:41:45.188000             🧑  作者: Mango

设计模式-抽象工厂模式

抽象工厂模式是一种创建型设计模式,旨在通过提供接口创建一系列相关或独立对象,而无需指定它们的具体类。该模式与工厂方法模式相似,但针对多个产品族而非单个产品。

优点
  • 单一职责原则: 将产品的实现隔离到特定的工厂类中,使得每个工厂都只负责一个产品族的创建。
  • 开放封闭原则: 可以向程序中动态添加新产品,
  • 与LSP原则相容: 可以使用一个产品族中的任意产品替换其它产品。可以保证客户端调用同一接口时,不关心具体的产品实现。
  • 简化客户端代码:客户端无需知道创建对象的具体类,只需要知道该对象的抽象接口。
缺点
  • 抽象工厂模式的实现比单一工厂模式和工厂方法模式要更复杂。
  • 当需要新增产品时,需要在工厂接口中新增方法,导致所有的具体工厂类都要修改代码,违反了开放封闭原则。
适用场景
  • 某些系统需要一些独立于其余部分的产品组件。
  • 系统添加新组件时,也需要为其添加新组件工厂。
示例代码
#抽象工厂模式示例代码
from abc import ABC, abstractmethod

class BaseOperation(ABC):
    @abstractmethod
    def calculate(self, x, y):
        pass

class AddOperation(BaseOperation):
    def calculate(self, x, y):
        return x + y

class SubOperation(BaseOperation):
    def calculate(self, x, y):
        return x - y

class BaseFactory(ABC):
    @abstractmethod
    def create_op_one(self):
        pass

    @abstractmethod
    def create_op_two(self):
        pass

class AddFactory(BaseFactory):
    def create_op_one(self):
        return AddOperation()

    def create_op_two(self):
        return AddOperation()

class SubFactory(BaseFactory):
    def create_op_one(self):
        return SubOperation()

    def create_op_two(self):
        return SubOperation()

def client_code(factory: BaseFactory) -> None:
    op_one = factory.create_op_one()
    op_two = factory.create_op_two()

    x = 10
    y = 5

    print(op_one.calculate(x, y))
    print(op_two.calculate(x, y))

add_factory = AddFactory()
sub_factory = SubFactory()

print("Testing add factory:")
client_code(add_factory)

print("\n")

print("Testing sub factory:")
client_code(sub_factory)

代码解释:

  • BaseOperation: 定义了抽象产品类
  • AddOperationSubOperation: 具体产品类,分别实现了 BaseOperation 接口
  • BaseFactory: 定义了抽象工厂类,其中 create_op_onecreate_op_two 是工厂方法,用于创建产品实例。
  • AddFactorySubFactory: 具体工厂类,实现了 BaseFactory 接口,并分别返回了 AddOperationSubOperation 对象。
  • client_code: 获取工厂实例,之后获取各种产品对象并调用它们的方法。