前言

构建者模式属于构建型模式;

构建者模式和工厂模式类似,不同的是增加了1个Directot类来控制对象的构建过程;

另外构造着模式着重于控制对象构造的先后顺序,而抽象工厂模式着重于创建多系列的不同产品对象

一、建造者模式

建造者模式和工厂模式相似都是用来创建1个复杂对象;

主要区别是建造者模式着重一步步构造1个复杂对象,而抽象工厂着重于创建多系列的产品对象;

构造着模式:   着重于控制对象构造的先后顺序

抽象工厂模式:着重于创建多系列的产品对象

1.概念

将1个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。

2.角色

抽象建造者(Builder):具体构造者类的约束接口

具体建造者(ConcreteBuilder):具体构造类也称为表示

指挥者(Director):在指挥者类中进行对象的构造

产品(Product):指挥者根据一定顺序构造出各种产品

3.优点

构造者模式的优点,主要集中体现在Director类。

隐藏了1个产品的内部结构和装配过程。

将构造代码于表示代码分离,在Director类中进行构造对象,而不是具体构造者类。

可以对构造过程进行更精细的控制。

4.代码

from abc import ABC, abstractmethod

''''
构造1个游戏角色
1个游戏角色由于4部分组成,分别为 head、body、arm、leg
该角色的组装顺序必须为 head-->body-->arm-->leg
'''


# 相当于工厂模式中的产品:role和build类为组合关系
class Role(object):
    def __init__(self, head=None, body=None, arm=None, leg=None):
        self.head = head
        self.body = body
        self.arm = arm
        self.leg = leg

    def __str__(self):
        return f"{self.head} {self.body}  {self.arm} {self.leg}"


# 抽象构造者:相当于工厂模式中的抽象工厂
class RoleBuilder(ABC):
    @abstractmethod
    def build_head(self):
        pass

    @abstractmethod
    def build_body(self):
        pass

    @abstractmethod
    def build_arm(self):
        pass

    @abstractmethod
    def build_leg(self):
        pass


# 具体构造者-构造出1个具体的美女角色-相当于工厂模式中的具体工厂类
class SexyGirlBuild(RoleBuilder):
    def __init__(self):
        self.role = Role()

    def build_head(self):
        self.role.head = "漂亮脸蛋"

    def build_body(self):
        self.role.body = "苗条身材"

    def build_arm(self):
        self.role.arm = "纤纤玉手"

    def build_leg(self):
        self.role.leg = "修长美腿"


# 具体构造者-构造出1个具体的怪兽角色-相当于工厂模式中的具体工厂类
class MonsterBuild(RoleBuilder):
    def __init__(self):
        self.role = Role()

    def build_head(self):
        self.role.head = "毛脸"

    def build_body(self):
        self.role.body = "蛇身"

    def build_arm(self):
        self.role.arm = "鳄鱼爪"

    def build_leg(self):
        self.role.leg = "狗腿"


# 指挥者-多出1个导演/指挥者,指挥者的作用是严格控制组装顺序
class RoleDirector(object):
    # 控制组装顺序
    def build_role(self, builder):
        builder.build_head()
        builder.build_body()
        builder.build_arm()
        builder.build_leg()
        return builder.role


# 高层代码-Client
# builder=SexyGirlBuild()
builder = MonsterBuild()
director = RoleDirector()
p = director.build_role(builder)
print(p)

 

 

 

参考

posted on 2024-02-03 17:27  Martin8866  阅读(11)  评论(0编辑  收藏  举报