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实现建造者模式:
...