• 基于python的23种设计模式


    以下是基于Python实现的23种设计模式及代码段和详细解释:

    1. 工厂模式(Factory Pattern)

    简介

    工厂模式是一种创建型设计模式,它允许客户端代码通过工厂方法创建对象,而无需直接实例化对象。在工厂方法模式中,我们定义一个工厂方法来创建对象,而不是使用类的构造函数。

    代码段

    1. from abc import ABC, abstractmethod
    2. class Product(ABC):
    3. """
    4. 抽象产品类,定义所有具体产品的接口
    5. """
    6. @abstractmethod
    7. def operation(self) -> str:
    8. pass
    9. class ConcreteProduct(Product):
    10. """
    11. 具体产品类
    12. """
    13. def operation(self) -> str:
    14. return "ConcreteProduct"
    15. class Creator(ABC):
    16. """
    17. 抽象创建者类,声明工厂方法,返回一个产品类的实例
    18. """
    19. @abstractmethod
    20. def factory_method(self) -> Product:
    21. pass
    22. def some_operation(self) -> str:
    23. """
    24. 可选:创建者还可以提供一些默认实现
    25. """
    26. product = self.factory_method()
    27. result = f"Creator: {product.operation()}"
    28. return result
    29. class ConcreteCreator1(Creator):
    30. """
    31. 具体创建者1,实现工厂方法以返回具体产品1的实例
    32. """
    33. def factory_method(self) -> Product:
    34. return ConcreteProduct()
    35. class ConcreteCreator2(Creator):
    36. """
    37. 具体创建者2,实现工厂方法以返回具体产品2的实例
    38. """
    39. def factory_method(self) -> Product:
    40. return ConcreteProduct()
    41. def client_code(creator: Creator) -> None:
    42. """
    43. 客户端代码只需要知道创建者的抽象类,无需关心具体实现类
    44. """
    45. print(f"Client: I'm not aware of the creator's class, but it still works.\n"
    46. f"{creator.some_operation()}", end="")
    47. if __name__ == "__main__":
    48. print("App: Launched with the ConcreteCreator1.")
    49. client_code(ConcreteCreator1())

    解释

    该代码段演示了工厂模式,其中有一个抽象产品类和其具体实现类。还有一个抽象创建者类来声明工厂方法和可选的默认实现。具体创建类实现工厂方法以返回具体产品类的实例。客户端代码调用抽象创建者而不是具体创建子类。

    2. 抽象工厂模式(Abstract Factory Pattern)

    简介

    抽象工厂是一种创建型设计模式,它允许您创建一组相关的对象,而无需指定其具体类。抽象工厂定义了一个接口,用于创建相关的对象,而不指定具体类。

    代码段

    1. from abc import ABC, abstractmethod
    2. class AbstractFactory(ABC):
    3. """
    4. 抽象工厂类,声明所有产品创建方法。
    5. """
    6. @abstractmethod
    7. def create_product_a(self):
    8. pass
    9. @abstractmethod
    10. def create_product_b(self):
    11. pass
    12. class ConcreteFactory1(AbstractFactory):
    13. """
    14. 具体工厂1,生成一组具有相互依赖关系的产品。
    15. """
    16. def create_product_a(self):
    17. return ConcreteProductA1()
    18. def create_product_b(self):
    19. return ConcreteProductB1()
    20. class ConcreteFactory2(AbstractFactory):
    21. """
    22. 具体工厂2,生成一组具有相互依赖关系的产品。
    23. """
    24. def create_product_a(self):
    25. return ConcreteProductA2()
    26. def create_product_b(self):
    27. return ConcreteProductB2()
    28. class AbstractProductA(ABC):
    29. """
    30. 抽象产品A类,定义具体产品共有的方法
    31. """
    32. @abstractmethod
    33. def useful_function_a(self) -> str:
    34. pass
    35. class AbstractProductB(ABC):
    36. """
    37. 抽象产品B类,定义具体产品共有的方法
    38. """
    39. @abstractmethod
    40. def useful_function_b(self) -> None:
    41. pass
    42. @abstractmethod
    43. def another_useful_function_b(self, collaborator: AbstractProductA) -> None:
    44. pass
    45. class ConcreteProductA1(AbstractProductA):
    46. """
    47. 具体产品A1,实现抽象产品A类的接口
    48. """
    49. def useful_function_a(self) -> str:
    50. return "The result of the product A1."
    51. class ConcreteProductA2(AbstractProductA):
    52. """
    53. 具体产品A2,实现抽象产品A类的接口
    54. """
    55. def useful_function_a(self) -> str:
    56. return "The result of the product A2."
    57. class ConcreteProductB1(AbstractProductB):
    58. """
    59. 具体产品B1,实现抽象产品B类的接口
    60. """
    61. def useful_function_b(self) -> str:
    62. return "The result of the product B1."
    63. def another_useful_function_b(self, collaborator: AbstractProductA) -> str:
    64. """
    65. B1实现了与特定产品A相关的功能。
    66. """
    67. result = collaborator.useful_function_a()
    68. return f"The result of the B1 collaborating with the ({result})"
    69. class ConcreteProductB2(AbstractProductB):
    70. """
    71. 具体产品B2,实现抽象产品B类的接口
    72. """
    73. def useful_function_b(self) -> str:
    74. return "The result of the product B2."
    75. def another_useful_function_b(self, collaborator: AbstractProductA) -> str:
    76. """
    77. B2实现了与特定产品A相关的功能。
    78. """
    79. result = collaborator.useful_function_a()
    80. return f"The result of the B2 collaborating with the ({result})"
    81. def client_code(factory: AbstractFactory) -> None:
    82. """
    83. 客户端代码仅与抽象工厂及其产品接口一起使用。
    84. """
    85. product_a = factory.create_product_a()
    86. product_b = factory.create_product_b()
    87. print(f"{product_b.useful_function_b()}")
    88. print(f"{product_b.another_useful_function_b(product_a)}", end="")
    89. if __name__ == "__main__":
    90. print("Client: Testing client code with the first factory type...")
    91. client_code(ConcreteFactory1())
    92. print("\n")
    93. print("Client: Testing the same client code with the second factory type...")
    94. client_code(ConcreteFactory2())

    解释

    该代码段演示了抽象工厂模式,其中有一个抽象工厂类和多个实现不同产品分类的具体工厂类。每个工厂类都实现了工厂方法来生产不同类型的产品。每个产品类实现了共同的抽象产品接口。客户端代码只与抽象工厂和产品接口一起使用,而不需要关心具体实现类。

    3. 建造者模式(Builder Pattern)

    简介

    建造者模式是一种创建型设计模式,它允许您使用相同的构建代码生成不同类型和形式的对象。建造者模式的精髓在于将对象构建过程与其表示分离。

    代码段

    1. from abc import ABC, abstractmethod
    2. from typing import Any
    3. class Builder(ABC):
    4. """
    5. 抽象建造者类,声明所有产品构建步骤。
    6. """
    7. @abstractmethod
    8. def produce_part_a(self) -> None:
    9. pass
    10. @abstractmethod
    11. def produce_part_b(self) -> None:
    12. pass
    13. @abstractmethod
    14. def produce_part_c(self) -> None:
    15. pass
    16. @abstractmethod
    17. def get_result(self) -> Any:
    18. pass
    19. class ConcreteBuilder1(Builder):
    20. """
    21. 具体建造者类1,实现所有产品构建方法,并返回最终结果。
    22. """
    23. def __init__(self) -> None:
    24. self.reset()
    25. def reset(self) -> None:
    26. self.product = Product1()
    27. def produce_part_a(self) -> None:
    28. self.product.add("PartA1")
    29. def produce_part_b(self) -> None:
    30. self.product.add("PartB1")
    31. def produce_part_c(self) -> None:
    32. self.product.add("PartC1")
    33. def get_result(self) -> Product1:
    34. result = self.product
    35. self.reset()
    36. return result
    37. class ConcreteBuilder2(Builder):
    38. """
    39. 具体建造者类2,实现所有产品构建方法,并返回最终结果。
    40. """
    41. def __init__(self) -> None:
    42. self.reset()
    43. def reset(self) -> None:
    44. self.product = Product2()
    45. def produce_part_a(self) -> None:
    46. self.product.add("PartA2")

  • 相关阅读:
    学生HTML网页作业:基于HTML+CSS+JavaScript画家企业8页
    YAMLException : java.nio.charset.MalformedInputException : Input length = 1
    Python实战:用多线程和多进程打造高效爬虫
    ABAP 遗传算法求解
    ZCU102 Zynq MPSoC IP设置与说明
    mysql 修改字段长度
    Python数据分析与机器学习20- 逻辑回归项目实战4-模型评估方法:混淆矩阵
    笔记--使用yolov5训练自定的数据集
    python入门基础知识·二
    【机器学习4】降维
  • 原文地址:https://blog.csdn.net/u012632105/article/details/133888897