源码地址:https://github.com/weilanhanf/PythonDesignPatterns
说明:
假如要组装一台电脑,将主板,CPU,内存等部件按照某个稳定的步骤组合,基本过程是不变的,而组成电脑的各个部件却可以是不同性能的,不同价位,或者是不同版本的,当组成电脑的时只需要选择不同的组件就可以按照基本相同的过程造出不同配置的电脑。也就是说建造者模式的意图是将一个复杂对象的构建过程与表示分离,它使用相同的构建步骤作用于不同的子对象以构建出不同表现形式的“复杂对象”。
实例:
从订单的角度构建一个快餐点餐系统
class Burger():
"""
主食类,价格名字
"""
name=""
price=0.0
def getPrice(self):
return self.price
def setPrice(self,price):
self.price=price
def getName(self):
return self.name
class cheeseBurger(Burger):
"""
奶酪汉堡
"""
def __init__(self):
self.name="cheese burger"
self.price=10.0
class spicyChickenBurger(Burger):
"""
香辣鸡汉堡
"""
def __init__(self):
self.name="spicy chicken burger"
self.price=15.0 class Snack():
"""
小食类,价格以及名字
"""
name = ""
price = 0.0
type = "SNACK"
def getPrice(self):
return self.price
def setPrice(self, price):
self.price = price
def getName(self):
return self.name
class chips(Snack):
"""
炸薯条
"""
def __init__(self):
self.name = "chips"
self.price = 6.0
class chickenWings(Snack):
"""
鸡翅
"""
def __init__(self):
self.name = "chicken wings"
self.price = 12.0 class Beverage():
"""
饮料
"""
name = ""
price = 0.0
type = "BEVERAGE"
def getPrice(self):
return self.price
def setPrice(self, price):
self.price = price
def getName(self):
return self.name
class coke(Beverage):
"""
可乐
"""
def __init__(self):
self.name = "coke"
self.price = 4.0
class milk(Beverage):
"""
牛奶
"""
def __init__(self):
self.name = "milk"
self.price = 5.0 class order():
"""
订单对象,一个订单中包含一份主食,一份小食,一份饮料
"""
burger=""
snack=""
beverage=""
def __init__(self,orderBuilder):
self.burger=orderBuilder.bBurger
self.snack=orderBuilder.bSnack
self.beverage=orderBuilder.bBeverage
def show(self):
print("Burger:%s"%self.burger.getName())
print("Snack:%s"%self.snack.getName())
print("Beverage:%s"%self.beverage.getName()) # 建造者
class orderBuilder():
"""
orderBuilder就是建造者模式中所谓的“建造者”,
将订单的建造与表示相分离,以达到解耦的目的。
在上面订单的构建过程中,如果将order直接通过参数定义好(其构建与表示没有分离),
同时在多处进行订单生成,此时需要修改订单内容,
则需要一处处去修改,业务风险也就提高了不少。
"""
bBurger=""
bSnack=""
bBeverage=""
def addBurger(self,xBurger):
self.bBurger=xBurger
def addSnack(self,xSnack):
self.bSnack=xSnack
def addBeverage(self,xBeverage):
self.bBeverage=xBeverage
def build(self):
return order(self) # Director类
class orderDirector():
"""
在建造者模式中,还可以加一个Director类,用以安排已有模块的构造步骤。
对于在建造者中有比较严格的顺序要求时,该类会有比较大的用处。
"""
order_builder=""
def __init__(self,order_builder):
self.order_builder=order_builder
def createOrder(self,burger,snack,beverage):
self.order_builder.addBurger(burger)
self.order_builder.addSnack(snack)
self.order_builder.addBeverage(beverage)
return self.order_builder.build() #场景实现
if __name__=="__main__":
order_builder=orderBuilder()
order_builder.addBurger(spicyChickenBurger())
order_builder.addSnack(chips())
order_builder.addBeverage(milk())
order_1=order_builder.build()
order_1.show()
执行结果:
Burger:spicy chicken burger
Snack:chips
Beverage:milk
优点:
使得产品内部表象可以独立的变化,使得客户不必知道产品内部的组成细节。对构建过程更加精细控制,将构建代码和表示代码分开。
缺点:
难以应对”分步骤构建算法“的需求变动。
适用性:
1、需要生成的产品有复杂的内部结构
2、需要生成的产品对象的属性相互依赖,建造者模式可以强破生成顺序。
参考链接:https://yq.aliyun.com/articles/70416?spm=a2c4e.11155435.0.0.495838daVpgS2g