基本介绍

建造者模式(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  
# ====================