设计模式-建造者模式(python)

建造者模式

介绍

意图: 建造者模式是将一个复杂对象的构建与它的表示分离使得同样的构建过程可以创建不同的表示。角色有:1.抽象创建者、2.具体创建者、3.指挥者、4.产品。建造者模式与抽象工厂模式相似,也用来创建复杂的对象。主要区别是 建造者模式着重一步步构造一个复杂对象(控制顺序)。而抽象工厂模式着重于多个系列的产品对象

主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。

何时使用:一些基本部件不会变,而其组合经常变化的时候。

如何解决:将变与不变分离开。

关键代码:建造者:创建和提供实例,导演:管理建造出来的实例的依赖关系。

应用实例: 1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。 2、JAVA 中的 StringBuilder。

优点: 1、隐藏了一个产品的内部结构和装配过程。 2、将构造代码与表示代码分开。 2、便于控制细节风险(可以对构造过程进行更精细的控制)。

缺点: 1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。

使用场景: 1、需要生成的对象具有复杂的内部结构。 2、需要生成的对象内部属性本身相互依赖。

注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。

写个例子来加强理解:

from abc import ABCMeta, abstractmethod

# ------产品------
class Player:

    def __init__(self, face = None, body = None, arms = None, legs = None):
        self.face = face
        self.body = body
        self.arms = arms
        self.legs = legs

    def __str__(self):
        return '%s, %s, %s, %s, %s' % (self.face, self.body, self.arms, self.legs)


# ------抽象建造者------
class PlayerBuilder(metaclass=ABCMeta):

    @abstractmethod
    def build_face(self):
        pass

    @abstractmethod
    def build_body(self):
        pass

    @abstractmethod
    def build_arms(self):
        pass

    @abstractmethod
    def build_legs(self):
        pass

# ------具体建造者(隐藏了一个产品的内部结构), 表示代码------
class GirlBuilder(PlayerBuilder):

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

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

    def build_body(self):
        self.player.body = '苗条的身材'

    def build_arms(self):
        self.player.arms = '细细的胳膊'

    def build_legs(self):
        self.player.legs = '大长腿'

# ------具体建造者,表示代码------
class MonsterBuilder(PlayerBuilder):

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

    def build_face(self):
        self.player.face = '绿脸'

    def build_body(self):
        self.player.body = '魁梧的身体'

    def build_arms(self):
        self.player.arms = '粗壮的胳膊'

    def build_legs(self):
        self.player.legs = '粗壮的大腿'

# ------指挥者,构造代码(构造代码和表示代码分开),可以对构造过程进行更加精细地控制------
class PlayerDirectory():

    def builder_player(self, builder):
        """
           隐藏了装配过程
           :param builder:
           :return:
        """
        builder.build_face()
        builder.build_body()
        builder.build_arms()
        builder.build_legs()
        return builder.player

# ------客户端------
builder = MonsterBuilder()
directer = PlayerDirectory()
p = directer.builder_player(builder)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
建造者模式是一种创建型设计模式,旨在通过将对象的构造与其表示分离来解决复杂对象的创建问题。该模式允许您按照步骤构建对象,同时也提供一种灵活的方式来创建不同类型的对象。 在Python中,建造者模式通常使用类和方法来实现。以下是一个基本的建造者模式示例: ```python class Computer: def __init__(self): self.__monitor = None self.__keyboard = None self.__mouse = None def set_monitor(self, monitor): self.__monitor = monitor def set_keyboard(self, keyboard): self.__keyboard = keyboard def set_mouse(self, mouse): self.__mouse = mouse class ComputerBuilder: def __init__(self): self.__computer = Computer() def get_computer(self): return self.__computer def build_monitor(self): monitor = "Dell Monitor" self.__computer.set_monitor(monitor) def build_keyboard(self): keyboard = "Logitech Keyboard" self.__computer.set_keyboard(keyboard) def build_mouse(self): mouse = "Microsoft Mouse" self.__computer.set_mouse(mouse) class Director: def __init__(self, builder): self.__builder = builder def build_computer(self): self.__builder.build_monitor() self.__builder.build_keyboard() self.__builder.build_mouse() builder = ComputerBuilder() director = Director(builder) director.build_computer() computer = builder.get_computer() ``` 在上面的示例中,我们定义了一个Computer类,它包含了电脑的一些属性,如显示器、键盘和鼠标等。我们还定义了一个ComputerBuilder类,它允许我们按照步骤构建Computer对象。最后,我们定义了一个Director类,它协调ComputerBuilder的构建过程。 当我们需要创建一个新的Computer对象时,我们只需创建一个ComputerBuilder实例并将其传递给Director类。Director类将协调ComputerBuilder的构建过程,并返回一个完整的Computer对象。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值