面向对象-04建造者模式

建造者模式

  • 内容:
    • 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
  • 角色:
    • 抽象建造者(Builder)
    • 具体建造者(Concrete Builder)
    • 指挥者(Director)
    • 产品( Product)
  • 优点:
    • 隐藏了一个产品的内部结构和装配过程
    • 将构造代码与表示代码分开
    • 可以对构造过程进行更精细的控制

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

'''
/**
  # @charset "utf-8"
  # @author Redskaber
  # @Filename 4建造者模式.py
  # @time 2022/3/28/22:24
**/
'''
from abc import ABCMeta, abstractmethod


# 角色对象属性
class Player:

    def __init__(self, face=None, body=None, arm=None, log=None):
        self.face = face
        self.body = body
        self.arm = arm
        self.log = log

    def __str__(self):
        return '%s %s %s %s' % (self.face, self.body, self.arm, self.log)


# 建造者(对象标准)
# 抽象建造者(Builder)
class PlayerBuilder(metaclass=ABCMeta):

    @abstractmethod
    def face(self):
        pass

    @abstractmethod
    def body(self):
        pass

    @abstractmethod
    def arm(self):
        pass

    @abstractmethod
    def log(self):
        pass


# 具体建造者(具体对象)(Concrete Builder)
class SexyGirlBuilder(PlayerBuilder):

    # 具体的建造者类返回是一个具体的对象
    def __init__(self):
        # 返回的objects
        self.player = Player()

    # 返回的这个对象的部分赋予
    def face(self):
        self.player.face = '漂亮的脸蛋'

    def body(self):
        self.player.body = '体态妖娆'

    def arm(self):
        self.player.arm = '纤细碧藕'

    def log(self):
        self.player.log = '纤细玉足'


# 具体建造者(具体对象)(Concrete Builder)
class MonsterBuilder(PlayerBuilder):

    def __init__(self):
        self.player = Player()

    def face(self):
        self.player.face = '牛头脸'

    def body(self):
        self.player.body = '万年海龟'

    def arm(self):
        self.player.arm = '树妖长枝'

    def log(self):
        self.player.log = '腾蛇尾'


# 指挥者(控制具体的实现类)(Director)
class Director:

    # 控制具体类对象,组装顺序
    def __init__(self, builder):
        self.builder = builder

    def director_builder(self):
        self.builder.face()
        self.builder.body()
        self.builder.arm()
        self.builder.log()
        # 返回objects
        return self.builder.player


# 产品( Product)
# 建造者类型
pb = SexyGirlBuilder()
# 添加控制对象
dire = Director(pb)
# 控制顺序,返回对象
b = dire.director_builder()
print(b)


# - 优点:
#   - 隐藏了一个产品的内部结构和装配过程
#   - 将构造代码与表示代码分开
#   - 可以对构造过程进行更精细的控制
#
# 建造者模式与抽象工厂模式相似,也用来创建复杂对象。主要区别是建造者模式着重一步步构造一个复杂对象,而抽象工厂模式着重于多个系列的产品对象。

posted @ 2022-06-10 11:00  Redskaber  阅读(13)  评论(0)    收藏  举报