• 内容:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
    • 用途:多类产品,每类产品一种,目的是把多种产品攒成一个大产品
    • 角色:
      • 抽象建造者(Builder)
      • 具体建造者(Concrete Builder)
      • 指挥者(Director)
      • 产品(Product)
    • 建造者模式与抽象工厂模式相似,也用来创建复杂对象。主要区别是建造者模式着重一步步构造一个复杂对象,而抽象工厂模式着重于多个系列的产品对象。

    image.png

    1. from abc import abstractmethod, ABCMeta
    2. # ----产品-----
    3. class Player:
    4. def __init__(self, face=None, body=None, arm=None, leg=None):
    5. self.face = face
    6. self.arm = arm
    7. self.leg = leg
    8. self.body = body
    9. def __str__(self):
    10. return "%s, %s, %s, %s" % (self.face, self.arm, self.body, self.leg)
    11. # -----抽象建造者------
    12. class PlayerBuilder(metaclass=ABCMeta):
    13. @abstractmethod
    14. def build_face(self):
    15. raise NotImplemented
    16. @abstractmethod
    17. def build_arm(self):
    18. raise NotImplemented
    19. @abstractmethod
    20. def build_leg(self):
    21. raise NotImplemented
    22. @abstractmethod
    23. def build_body(self):
    24. raise NotImplemented
    25. # -----具体建造者-----
    26. class BeautifulWomanBuilder(PlayerBuilder):
    27. def __init__(self):
    28. self.player = Player()
    29. def build_face(self):
    30. self.player.face = "漂亮脸蛋"
    31. def build_arm(self):
    32. self.player.arm = "细胳膊"
    33. def build_body(self):
    34. self.player.body = "细腰"
    35. def build_leg(self):
    36. self.player.leg = "长腿"
    37. def get_player(self):
    38. return self.player
    39. # ---- 指挥者------
    40. class PlayerDirector:
    41. def build_player(self, builder):
    42. builder.build_body()
    43. builder.build_arm()
    44. builder.build_leg()
    45. builder.build_face()
    46. return builder.get_player()
    47. director = PlayerDirector()
    48. builder = BeautifulWomanBuilder()
    49. p = director.build_player(builder)
    50. print(p)
    • 适用场景:
      • 当创建负责对象的算法(Director)应该独立于该对象的组成部分以及它们的装配方式(Builder) 时。
      • 当构造过程允许被构造的对象有不同的表示时(不同Builder)。
    • 优点:
      • 隐藏了一个产品的内部结构和装配过程。
      • 将构造代码与表示代码分开
      • 可以对构造过程进行更精细的控制。