Design Patterns - Builder

Builder(生成器) — 对象创建型模式

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

适用场景

  1. 创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式(注意,两个重点)
  2. 当构造过程必须允许被构造的对象有不同的表示时。

优点

  1. 它可以使你改变一个产品的内部表示:因为产品的表示都封装到Builder里面,如果想替换产品的内部表示,只需替换Builder即可。
  2. 它将构造代码和表示代码分开。
  3. 它使你可对构造过程进行更精细的控制。

其他一些要考虑的实现问题:

  1. 装配和构造接口:生成器逐步构造它们的产品。因此 Builder 类接口必须足够普遍,以便为各种类型的具体生成器构造产品。一个关键的设计问题在于构造和装配过程。构造请求的结果只是被添加到产品中,这样是没什么问题的,但如果在一个构造接口中需要它前序构造请求的结果,这种情况下,生成器应该将前者的结果返回给导向器,然后导向器将他们回传给生成器去创建父节点。

UML图

在这里插入图片描述

示例

class Meal(object):
    def __init__(self, food="", drink=""):
        self.food = food
        self.drink = drink

class MealBuilder(object):
    meal = Meal()

    def buildFood(self):
        raise NotImplementedError

    def buildDrink(self):
        raise NotImplementedError

    def getMeal(self):
        return self.meal

class MealBuilderA(MealBuilder):
    def buildFood(self):
        self.meal.food = "薯条"

    def buildDrink(self):
        self.meal.drink = "可乐"

class MealBuilderB(MealBuilder):
    def buildFood(self):
        self.meal.food = "鸡翅"

    def buildDrink(self):
        self.meal.drink = "柠檬果汁"

class KFCDirector:
    def __init__(self, builder):
        self.builder = builder

    def construct(self):
        self.builder.buildFood()
        self.builder.buildDrink()
        return self.builder.meal



client


director = KFCDirector(MealBuilderA())
meal = director.construct()
print(meal.food)
print(meal.drink)
print("*******************")
director.builder = MealBuilderB()
meal = director.construct()
print(meal.food)
print(meal.drink)
"""
output:
薯条
可乐
*******************
鸡翅
柠檬果汁
"""

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值