• 内容:定义一个工厂类接口,让工厂子类来创建一系列相关或相互依赖的对象。
    • 例如:生产一部手机,需要手机壳、CPU、操作系统三类对象进行组装,其中每类对象都有不同的种类。对每个具体工厂,分别生产一部手机所需要的三个对象。
    • 角色:
      • 抽象工厂角色(Creator)
      • 具体工厂角色(Concrete Creator)
      • 抽象产品角色(Product)
      • 具体产品角色(Concrete Product)
      • 客户端(Client)
    • 相比工厂方法模式,抽象工厂模式中的每个具体工厂都生产一套产品。

    image.png

    1. from abc import ABCMeta, abstractmethod
    2. # ------抽象产品-------
    3. class PhoneShell(metaclass=ABCMeta):
    4. @abstractmethod
    5. def show_shell(self):
    6. raise NotImplementedError
    7. class CPU(metaclass=ABCMeta):
    8. @abstractmethod
    9. def show_cpu(self):
    10. raise NotImplementedError
    11. class OS(metaclass=ABCMeta):
    12. @abstractmethod
    13. def show_os(self):
    14. raise NotImplementedError
    15. # ------抽象工厂-------
    16. class PhoneFactory(metaclass=ABCMeta):
    17. @abstractmethod
    18. def make_shell(self):
    19. raise NotImplementedError
    20. @abstractmethod
    21. def make_cpu(self):
    22. raise NotImplementedError
    23. @abstractmethod
    24. def make_os(self):
    25. raise NotImplementedError
    26. # -----具体产品-----
    27. class SmallShell(PhoneShell):
    28. def show_shell(self):
    29. print("普通手机小手机壳")
    30. class BigShell(PhoneShell):
    31. def show_shell(self):
    32. print("普通手机大手机壳")
    33. class AppleShell(PhoneShell):
    34. def show_shell(self):
    35. print("苹果手机壳")
    36. class SnapDragonCPU(CPU):
    37. def show_cpu(self):
    38. print("晓龙CPU")
    39. class MediaTekCPU(CPU):
    40. def show_cpu(self):
    41. print("骁龙CPU")
    42. class AppleCPU(CPU):
    43. def show_cpu(self):
    44. print("联发科CPU")
    45. class Android(OS):
    46. def show_os(self):
    47. print("苹果CPU")
    48. class IOS(OS):
    49. def show_os(self):
    50. print("ios系统")
    51. # ----具体工厂-----
    52. class MiFactory(PhoneFactory):
    53. def make_cpu(self):
    54. return SnapDragonCPU()
    55. def make_os(self):
    56. return Android()
    57. def make_shell(self):
    58. return BigShell()
    59. class HuaweiFactory(PhoneFactory):
    60. def make_cpu(self):
    61. return MediaTekCPU()
    62. def make_os(self):
    63. return Android()
    64. def make_shell(self):
    65. return SmallShell()
    66. class IPhoneFactory(PhoneFactory):
    67. def make_cpu(self):
    68. return AppleCPU()
    69. def make_os(self):
    70. return IOS()
    71. def make_shell(self):
    72. return AppleShell()
    73. # ----客户端----
    74. class Phone:
    75. def __init__(self, cpu, os, shell):
    76. self.cpu = cpu
    77. self.os = os
    78. self.shell = shell
    79. def show_info(self):
    80. print("手机信息:")
    81. self.cpu.show_cpu()
    82. self.os.show_os()
    83. self.shell.show_shell()
    84. def make_phone(factory):
    85. cpu = factory.make_cpu()
    86. os = factory.make_os()
    87. shell = factory.make_shell()
    88. return Phone(cpu, os, shell)
    89. p1 = make_phone(IPhoneFactory())
    90. p1.show_info()
    • 适用场景:
      • 系统要独立于产品的创建与组合时。
      • 强调一系列相关的产品对象的设计以便进行联合使用时。
      • 提供一个产品类库,想隐藏产品的具体实现时。
    • 优点:
      • 将客户端与类的具体实现相分离。
      • 每个工厂创建了一个完整的产品系列,使得易于交换产品系列。
      • 有利于产品的一致性(即产品之间的约束关系)
    • 缺点:
      • 难以支持新种类的(抽象)产品