当前位置:   article > 正文

【Python笔记-设计模式】抽象工厂模式

【Python笔记-设计模式】抽象工厂模式

一、说明

(一) 解决问题

抽象工厂是一种创建型设计模式,主要解决接口选择的问题。能够创建一系列相关的对象,而无需指定其具体类。

(二) 使用场景

系统中有多于一个的产品族,且这些产品族类的产品需实现同样的接口。

例如:有一个家具工厂,可以生产的产品有椅子、沙发、咖啡桌,各产品又分为不同的风格。

而客户需要的是相同风格的各类产品

二、结构

  1. 抽象产品 (Abstract Product) 为构成系列产品的一组不同但相关的产品声明接口。
  2. 具体产品 (Concrete Product) 是抽象产品的多种不同类型实现。 所有变体 (维多利亚/现代) 都必须实现相应的抽象产品 (椅子/沙发)。
  3. 抽象工厂 (Abstract Factory) 接口声明了一组创建各种抽象产品的方法。
  4. 具体工厂 (Concrete Factory) 实现抽象工厂的构建方法。 每个具体工厂都对应特定产品变体, 且仅创建此种产品变体。
  5. 尽管具体工厂会对具体产品进行初始化, 其构建方法签名必须返回相应的抽象产品。 这样, 使用工厂类的客户端代码就不会与工厂创建的特定产品变体耦合。 客户端 (Client) 只需通过抽象接口调用工厂和产品对象, 就能与任何具体工厂/产品变体交互。

三、伪代码

  1. __doc__ = """
  2. 抽象工厂模式
  3. 例:有一个家具工厂,可以生产的产品有椅子、沙发、咖啡桌,各产品又分为不同的风格。
  4. """
  5. from abc import ABC, abstractmethod
  6. class AbstractFactory(ABC):
  7. """
  8. 抽象工厂基类
  9. 提供创建三种家具抽象方法
  10. """
  11. @abstractmethod
  12. def create_chair(self):
  13. pass
  14. @abstractmethod
  15. def create_sofa(self):
  16. pass
  17. @abstractmethod
  18. def create_coffee_table(self):
  19. pass
  20. class ModernFactory(AbstractFactory):
  21. """
  22. 具体工厂基类
  23. 实现创建现代风格家具的方法
  24. """
  25. def create_chair(self):
  26. return ModernChair()
  27. def create_sofa(self):
  28. return ModernSofa()
  29. def create_coffee_table(self):
  30. return ModernCoffeeTable()
  31. class VictorianFactory(AbstractFactory):
  32. """
  33. 具体工厂基类
  34. 实现创建维多利亚风格家具的方法
  35. """
  36. def create_chair(self):
  37. return VictorianChair()
  38. def create_sofa(self):
  39. return VictorianSofa()
  40. def create_coffee_table(self):
  41. return VictorianCoffeeTable()
  42. class AbstractProduct(ABC):
  43. """
  44. 抽象产品基类
  45. 提供使用抽象方法
  46. """
  47. @abstractmethod
  48. def use(self):
  49. pass
  50. class ModernChair(AbstractProduct):
  51. """具体产品"""
  52. def use(self):
  53. print("现代风格椅子")
  54. class ModernSofa(AbstractProduct):
  55. """具体产品"""
  56. def use(self):
  57. print("现代风格沙发")
  58. class ModernCoffeeTable(AbstractProduct):
  59. """具体产品"""
  60. def use(self):
  61. print("现代风格咖啡桌")
  62. class VictorianChair(AbstractProduct):
  63. """具体产品"""
  64. def use(self):
  65. print("维多利亚风格椅子")
  66. class VictorianSofa(AbstractProduct):
  67. """具体产品"""
  68. def use(self):
  69. print("维多利亚风格沙发")
  70. class VictorianCoffeeTable(AbstractProduct):
  71. """具体产品"""
  72. def use(self):
  73. print("维多利亚风格咖啡桌")
  74. def client_code(factory):
  75. """客户端"""
  76. chair = factory.create_chair()
  77. sofa = factory.create_sofa()
  78. coffee_table = factory.create_coffee_table()
  79. chair.use()
  80. sofa.use()
  81. coffee_table.use()
  82. if __name__ == '__main__':
  83. """
  84. Client: Testing client code with the first factory type:
  85. 现代风格椅子
  86. 现代风格沙发
  87. 现代风格咖啡桌
  88. Client: Testing the same client code with the second factory type:
  89. 维多利亚风格椅子
  90. 维多利亚风格沙发
  91. 维多利亚风格咖啡桌
  92. """
  93. print("Client: Testing client code with the first factory type:")
  94. factory1 = ModernFactory()
  95. client_code(factory1)
  96. print()
  97. print("Client: Testing the same client code with the second factory type:")
  98. factory2 = VictorianFactory()
  99. client_code(factory2)

四、优缺点

优点

  • 你可以确保同一工厂生成的产品相互匹配。
  • 你可以避免客户端和具体产品代码的耦合。
  • 单一职责原则。 你可以将产品生成代码抽取到同一位置, 使得代码易于维护。
  • 开闭原则。 向应用程序中引入新产品变体时, 你无需修改客户端代码。

缺点

  • 由于采用该模式需要向应用中引入众多接口和类, 代码可能会比之前更加复杂。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/45324
推荐阅读
相关标签
  

闽ICP备14008679号