作者:大家好,我是阿旭
支持我:点赞收藏⭐️留言
系列专栏:23种设计模式详解-Python
将一个复杂对象的构建与表示分离,同样的构建过程可以创建不同的东西。
建造者模式与抽象工厂模式相似,也用来创建复杂对象。
主要区别是建造者模式着重一步步构造一个复杂对象,而抽象工厂模式着重于多个系列的产品对象。
角色
比如说我们现在要做游戏里的角色形象,我们把角色形象分为两个部分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类加上face和body两个属性,通过这两个属性来构建一个完整的角色。
抽象建造者
想象一下,我们需要为这个产品来定义怎样的流水线呢?
1.我们需要给他建造face
2.我们需要给他建造body
所以我们需要在抽象类中定义构建face和body的抽象方法。代码如下:
class PlayerBuilder(metaclass=ABCMeta):
@abstractmethod
def build_face(self):
pass
@abstractmethod
def build_body(self):
pass
具体建造者
具体建造者类继承了建造者抽象类,在此类中我们需要实现build_face、build_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)