23种Python设计模式之建造者模式详解

💖 作者:大家好,我是阿旭😜
🎉 支持我:点赞👍收藏⭐️留言📝
📣 系列专栏:23种设计模式详解-Python 🍁

建造者模式

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

建造者模式与抽象工厂模式相似,也用来创建复杂对象。
主要区别是建造者模式着重一步步构造一个复杂对象,而抽象工厂模式着重于多个系列的产品对象。

角色

  • 1.产品
  • 2.抽象建造者
  • 3.具体建造者
  • 4.指挥者
具体实现

比如说我们现在要做游戏里的角色形象,我们把角色形象分为两个部分face和body,现在我们使用建造者模式来编写代码。

产品
首先我们的产品肯定就是游戏中的角色了

class Player:
    def __init__(self, face=None, body=None):
        self.face = face
        self.body = body

    def __str__(self):
        return "%s %s" % (self.face, self.body)

在这里我们先定义好产品类,第一步重写__init__方法,给Player类加上facebody两个属性,通过这两个属性来构建一个完整的角色。

抽象建造者
想象一下,我们需要为这个产品来定义怎样的流水线呢?
1.我们需要给他建造face
2.我们需要给他建造body
所以我们需要在抽象类中定义构建face和body的抽象方法。代码如下:

class PlayerBuilder(metaclass=ABCMeta):
    @abstractmethod
    def build_face(self):
        pass

    @abstractmethod
    def build_body(self):
        pass

具体建造者
具体建造者类继承了建造者抽象类,在此类中我们需要实现build_facebuild_body两个来自父类的方法。
在这里我们分别定义了Gril和Monster两个个建造者,当传入空白产品时,为其添加各自的属性。

class Gril(PlayerBuilder):
    def __init__(self):
        self.player = Player()

    def build_face(self):
        self.player.face = "漂亮脸蛋"

    def build_body(self):
        self.player.body = "漂亮身材"

class Monster(PlayerBuilder):
    def __init__(self):
        self.player = Player()

    def build_face(self):
        self.player.face = "怪兽脸蛋"

    def build_body(self):
        self.player.body = "怪兽身材"

指挥者
建造者模式跟其他模式不同的一点就是他可以控制构建过程的顺序,这个控制顺序的角色叫做指挥者。
在这里我们定义了一个指挥者类,在其内部定义了create_player方法,并为其增加了builder参数,builder是指你需要建造的具体角色工厂类,在这里我们先build了body然后在buil了face,控制了其先后顺序。代码如下:

class PlayerDirector:
    def create_player(self, builder):
        builder.build_body()
        builder.build_face()
        return builder.player

客户端调用

builder = Monster()
director = PlayerDirector()
p = director.create_player(builder)
print(p)

Output:
在这里插入图片描述
🎉 支持我:点赞👍收藏⭐️留言📝
📣 系列专栏:23种设计模式详解-Python 🍁

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wxlo0.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值