Builder(生成器) — 对象创建型模式
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
适用场景
- 创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式(注意,两个重点)
- 当构造过程必须允许被构造的对象有不同的表示时。
优点
- 它可以使你改变一个产品的内部表示:因为产品的表示都封装到Builder里面,如果想替换产品的内部表示,只需替换Builder即可。
- 它将构造代码和表示代码分开。
- 它使你可对构造过程进行更精细的控制。
其他一些要考虑的实现问题:
- 装配和构造接口:生成器逐步构造它们的产品。因此 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:
薯条
可乐
*******************
鸡翅
柠檬果汁
"""