建造者模式

建造者模式

 

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

适用场景:
  当创建复杂对象的算法(Director)应该独立于该对象的组成部分(Builder)以及它们的装配方式时
  当构造过程允许被构造的对象有不同的表示时(不同Builder)。
角色:
  抽象建造者(Builder)
  具体建造者(Concrete Builder)
  指挥者(Director)
  产品(Product)

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

优点:
  隐藏了一个产品的内部结构和装配过程
  将构造代码与表示代码分开
  可以对构造过程进行更精细的控制

 

from abc import abstractmethod, ABCMeta

#------产品------
class Player:
    def __init__(self, face=None, body=None, arm=None, leg=None):
        self.face = face
        self.arm = arm
        self.leg = leg
        self.body = body

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


#------建造者------
class PlayerBuilder(metaclass=ABCMeta):
    @abstractmethod
    def build_face(self):
        pass
    @abstractmethod
    def build_arm(self):
        pass
    @abstractmethod
    def build_leg(self):
        pass
    @abstractmethod
    def build_body(self):
        pass
    @abstractmethod
    def get_player(self):
        pass

# 建造生产的类
class BeautifulWomanBuilder(PlayerBuilder):
    def __init__(self):
        self.player = Player()
    def build_face(self):
        self.player.face = "漂亮脸蛋"
    def build_arm(self):
        self.player.arm="细胳膊"
    def build_body(self):
        self.player.body="细腰"
    def build_leg(self):
        self.player.leg="长腿"
    def get_player(self):
        return self.player

# 用于生产 产品的类
class PlayerDirector:
    def build_player(self, builder):
        builder.build_body()
        builder.build_arm()
        builder.build_leg()
        builder.build_face()
        return builder.get_player()

#客户端
director = PlayerDirector()
builder = BeautifulWomanBuilder()
p = director.build_player(builder)
print(p)

建造者模式
建造者模式

 

建造者模式和工厂模式的区别:

工厂方法模式注重的是整体对象的创建方法,而建造者模式注重的是部件构建的过程,旨在通过一步一步地精确构造创建出一个复杂的对象。

工厂模式关心整体,建造者模式关心细节。

我们举个简单例子来说明两者的差异,如要制造一个超人,

如果使用工厂方法模式,直接产生出来的就是一个力大无穷、能够飞翔、内裤外穿的超人, 表现在类上就是if filter:  superman = superMan();

如果使用建造者模式,则需要组装手、头、脚、躯干等部分,然后再把内裤外穿,于是一个超人就诞生了, 表现在使用上就是if filter:  build_head, build_leg, build_body等

 

posted @ 2017-09-21 19:49  Adamanter  阅读(130)  评论(0编辑  收藏  举报