Design 建造者模式

基本介绍

使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

具体内容是讲一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

特点:灵活,耦合度低,可自由组合,提供暴露接口使用户不必关心底层的实现,直接调用即可

建造者模式与抽象工厂模式相似,也用来创建复杂的对象。

主要的区别是建造者模式着重一步步构造一个复杂且灵活的对象,而抽象工厂模式着重于同时提供多个系列的产品对象。

案例图示

去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的”套餐":

肯德基- 揭密真相

优缺点

优点:

  • 隐藏了一个产品的内部结构和装配过程
  • 将构造代码与表示代码分开
  • 可以对构造过程进行更加精细的控制

缺点:

  • 产品必须有共同点,范围有限制
  • 如果内部变化复杂,会有很多的建造类

Python实现

用Python实现建造者模式:

#! /usr/local/bin/python3
# -*- coding:utf-8 -*-

from abc import ABCMeta, abstractmethod


class Product(object):
    """最终方案"""

    def __init__(self, hamburger=None, coke=None, other=None):
        """
        :param hamburger: 鸡肉汉堡、牛肉汉堡
        :param coke: 百事可乐、可口可乐
        :param other: 薯条、薯片
        """
        self.hamburger = hamburger
        self.coke = coke
        self.other = other

    def __str__(self):
        return "套餐方案:%s + %s + %s" % (self.hamburger, self.coke, self.other)


class CombinationPlan(metaclass=ABCMeta):
    """套餐组合方案抽象基类"""

    @abstractmethod
    def build_hamburger(self):
        pass

    @abstractmethod
    def build_coke(self):
        pass

    @abstractmethod
    def build_other(self):
        pass


class Plan01(CombinationPlan):
    """方案1"""

    def __init__(self):
        self.product = Product()

    def build_hamburger(self):
        self.product.hamburger = "鸡肉汉堡"

    def build_coke(self):
        self.product.coke = "百事可乐"

    def build_other(self):
        self.product.other = "薯片"


class Plan02(CombinationPlan):
    """方案2"""

    def __init__(self):
        self.product = Product()

    def build_hamburger(self):
        self.product.hamburger = "牛肉汉堡"

    def build_coke(self):
        self.product.coke = "可口可乐"

    def build_other(self):
        self.product.other = "薯条"


class KFC:
    def get_product(self, choice):
        # 根据选择的套餐方案开始建造产品
        choice.build_hamburger()
        choice.build_coke()
        choice.build_other()
        # 返回产品
        return choice.product


if __name__ == '__main__':
    kfc = KFC()

    # 选择的方案是01
    choice01 = Plan01()
    food = kfc.get_product(choice01)
    print(food)

    # 选择的方案是02
    choice02 = Plan02()
    food = kfc.get_product(choice02)
    print(food)

执行结果:

套餐方案:鸡肉汉堡 + 百事可乐 + 薯片
套餐方案:牛肉汉堡 + 可口可乐 + 薯条

Golang实现

用Golang实现建造者模式:

...
posted @ 2021-04-11 23:29  云崖君  阅读(52)  评论(0编辑  收藏  举报