基本介绍
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。
具体内容是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
特点:灵活,耦合度低,可自由组合,提供暴露接口使用户不必关心底层的实现,直接调用即可
建造者模式与抽象工厂模式相似,也用来创建复杂的对象。
主要的区别是建造者模式着重一步步构造一个复杂且灵活的对象,而抽象工厂模式着重于同时提供多个系列的产品对象。
该模式属于创建型模式。
案例图示
去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的”套餐":
优缺点
优点:
- 隐藏了一个产品的内部结构和装配过程
- 将构造代码与表示代码分开
- 可以对构造过程进行更加精细的控制
缺点:
- 产品必须有共同点,范围有限制
- 如果内部变化复杂,会有很多的建造类
代码实现
用Python实现建造者模式:
# 最终产品
class Product:
def __init__(self) -> None:
self.hamburger = None
self.coke = None
def __str__(self) -> str:
return "Product".center(20, "=") + \
"\n" + ("hamburger : %s" % self.hamburger).center(20, " ") + \
"\n" + ("coke : %s" % self.coke).center(20, " ") + \
"\n" + "=" * 20
# 套餐组合
# 套餐1(肥牛组合):牛肉汉堡、可口可乐
class BeefPackage:
def __init__(self) -> None:
self.product = Product()
def buildHamburger(self):
self.product.hamburger = "Beaf Hamburger"
def buildCoke(self):
self.product.coke = "Coca Cola"
# 套餐2(炸鸡套餐) : 鸡肉汉堡、百事可乐
class ChickenPackage:
def __init__(self) -> None:
self.product = Product()
def buildHamburger(self):
self.product.hamburger = "Chicken Hamburger"
def buildCoke(self):
self.product.coke = "Pepsi Cola"
# 建造者类
class KfcStore:
def getProduct(self):
package = None
choice = input(
"Please Choice Your Package\na.Beef Package\nb.Chicken Package\n>>> ")
if choice == "a":
package = BeefPackage()
elif choice == "b":
package = ChickenPackage()
else:
raise ValueError("don't have package choice %r" % choice)
# 根据选择套餐方案开始建造产品
package.buildHamburger()
package.buildCoke()
return package.product
if __name__ == "__main__":
kfc = KfcStore()
product = kfc.getProduct()
print(product)
# Please Choice Your Package
# a.Beef Package
# b.Chicken Package
# >>> b
# ======Product=======
# hamburger : Chicken Hamburger
# coke : Pepsi Cola
# ====================