📜  抽象工厂方法Python设计模式(1)

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

抽象工厂方法Python设计模式

抽象工厂方法是一种创建型设计模式,该模式提供了一种解耦对象的创建方法。它通过提供一个工厂接口,该接口可以用于创建相关对象系列,而无需指定具体的类。这种方法可以实现对象的抽象化,使得我们可以对对象进行分组并以一种统一的方式管理。

优点
  • 容易更改类的实现,即便是在运行时也可以进行修改
  • 可以遵循开闭原则(OCP),即使添加新的类也不会影响代码的其他部分
缺点
  • 需要创建许多对象,因此可能会影响内存的性能
适用场景
  • 当需要创建相关对象系列时
  • 当希望提供一个以一种统一的方式管理对象的方法时
  • 当需要更改类的实现而不影响其他部分
代码实现
from abc import ABC, abstractmethod


# 抽象产品A
class AbstractProductA(ABC):
    @abstractmethod
    def do_something(self) -> None:
        pass


# 抽象产品B
class AbstractProductB(ABC):
    @abstractmethod
    def do_something(self) -> None:
        pass


# 具体产品A1
class ConcreteProductA1(AbstractProductA):
    def do_something(self) -> None:
        print("具体产品A1")


# 具体产品A2
class ConcreteProductA2(AbstractProductA):
    def do_something(self) -> None:
        print("具体产品A2")


# 具体产品B1
class ConcreteProductB1(AbstractProductB):
    def do_something(self) -> None:
        print("具体产品B1")


# 具体产品B2
class ConcreteProductB2(AbstractProductB):
    def do_something(self) -> None:
        print("具体产品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()


# 客户端
class Client:
    def __init__(self, factory: AbstractFactory):
        self._product_a = factory.create_product_a()
        self._product_b = factory.create_product_b()

    def run(self) -> None:
        self._product_a.do_something()
        self._product_b.do_something()


if __name__ == "__main__":
    client1 = Client(ConcreteFactory1())
    client1.run()

    client2 = Client(ConcreteFactory2())
    client2.run()
结论

抽象工厂方法是一种实现对象抽象化的方法,它可以将一组相关对象作为单个单元进行处理。这可以使客户端更容易使用这些对象,并在需要时更改其实现。此方法还提供了一种以一种统一的方式管理对象的方法。