Builder(生成器) — 对象创建型模式

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

适用场景

  1. 创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式(注意,两个重点)
  2. 当构造过程必须允许被构造的对象有不同的表示时。

优点

  1. 它可以使你改变一个产品的内部表示:因为产品的表示都封装到Builder里面,如果想替换产品的内部表示,只需替换Builder即可。
  2. 它将构造代码和表示代码分开。
  3. 它使你可对构造过程进行更精细的控制。

其他一些要考虑的实现问题:

  1. 装配和构造接口:生成器逐步构造它们的产品。因此 Builder 类接口必须足够普遍,以便为各种类型的具体生成器构造产品。一个关键的设计问题在于构造和装配过程。构造请求的结果只是被添加到产品中,这样是没什么问题的,但如果在一个构造接口中需要它前序构造请求的结果,这种情况下,生成器应该将前者的结果返回给导向器,然后导向器将他们回传给生成器去创建父节点。

UML图

示例

class Meal(object):def __init__(self, food="", drink=""):self.food = foodself.drink = drinkclass MealBuilder(object):meal = Meal()def buildFood(self):raise NotImplementedErrordef buildDrink(self):raise NotImplementedErrordef getMeal(self):return self.mealclass MealBuilderA(MealBuilder):def buildFood(self):self.meal.food = "薯条"def buildDrink(self):self.meal.drink = "可乐"class MealBuilderB(MealBuilder):def buildFood(self):self.meal.food = "鸡翅"def buildDrink(self):self.meal.drink = "柠檬果汁"class KFCDirector:def __init__(self, builder):self.builder = builderdef construct(self):self.builder.buildFood()self.builder.buildDrink()return self.builder.meal

client


director = KFCDirector(MealBuilderA())
meal = director.construct()
print(meal.food)
print(meal.drink)
print("*******************")
director.builder = MealBuilderB()
meal = director.construct()
print(meal.food)
print(meal.drink)
"""
output:
薯条
可乐
*******************
鸡翅
柠檬果汁
"""

Design Patterns - Builder相关推荐

  1. 设计模式(Design Patterns)详解

    设计模式(Design Patterns) --可复用面向对象软件的基础一般会用到的: Factory( 工厂模式) Singleton(单例模式) 这两个比较多 Proxy(代理模式) Adapte ...

  2. Java23中设计模式(Design Patterns)详解

    2019独角兽企业重金招聘Python工程师标准>>> 设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复 ...

  3. 设计模式教程(Design Patterns Tutorial)笔记之一 创建型模式(Creational Patterns)...

    设计模式教程(Design Patterns Tutorial)笔记之一 创建型模式(Creational Patterns) 目录 · 概述 · Factory · What is the Fact ...

  4. [笔记一]Essential JavaScript Design Patterns For Beginners

    最近在看Essential JavaScript Design Patterns For Beginners 原文地址:http://www.addyosmani.com/resources/esse ...

  5. Design patterns 设计模式

    Christopher Alexander 说过:"每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心.这样,你就能一次又一次地使用该方案而不必做重复劳动" ...

  6. 设计模式 - Design Patterns

    一. 什么是设计模式? 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结. 设计模式对于面向对象编程语言的开发者来说是必备知识,但对于开发者来说设 ...

  7. 艾伟_转载:C# Design Patterns (3) - Decorator

    Decorator Pattern (装饰模式) 装饰模式可「动态」地给一个对象添加一些额外的职责,提供有别于「继承」的另一种选择.就扩展功能而言,Decorator Pattern 透过 Aggre ...

  8. 艾伟_转载:C# Design Patterns (4) - Proxy

    本帖介绍 Proxy Pattern (代理模式). Proxy Pattern (代理模式) The Proxy Pattern provides a surrogate or placeholde ...

  9. 检索com类工厂 80070005_Hands-On Design Patterns With C++(十二)友元工厂

    目录: trick:Hands-On Design Patterns With C++(零)前言​zhuanlan.zhihu.com 友元工厂 c++中,友元用于给予其他类访问权限.本章具体讨论以下 ...

最新文章

  1. 面试题整理 8 字符串排序扩展题
  2. 30万奖金等你拿 | “信也科技杯”第五届数据解决方案应用大赛火热报名中!...
  3. 各种震撼的慢镜头,奇怪的知识又增加了!​
  4. 设计php框架_自制PHP框架之设计模式
  5. 项目分层思路——管家婆
  6. python中ndarray对象实例化_Python —— 实例化ndarray对象
  7. HALCON 20.11:深度学习笔记(3)---Data(数据)
  8. android-eclips中logcat不显示信息的问题解决
  9. NOIP2007 T1奖学金 解题报告-S.B.S.
  10. 基于STM32CubeIDE的STM32H750 DCMI接口驱动OV2640读取JPEG结合自编上位机实现可以用的数字图传
  11. android停止蓝牙音乐服务,蓝牙音乐播放状态一直为暂停态
  12. bitcoin core全节点钱包同步太慢的解决方法及钱包数据文件移动的方法
  13. 二进制与十进制转换器
  14. 数字华容道java_从零开发HarmonyOS(鸿蒙)手机小游戏——数字华容道
  15. EMC | 静电防护方法
  16. 动态规划的递归写法和递推写法
  17. word多个标题一不能显示在一页
  18. 我的前端知识体系构建(上)
  19. 先搞清楚荷、莲、芙蓉的区别
  20. 2021-04-15 测试面试题

热门文章

  1. 日常学习——记使用POI多线程写Excel数据(续)
  2. c语言中余数取整,C 逻辑运算, 移位运算 , 取整 , 取模(取余)
  3. Visual Studio Community 2019 安装
  4. 15_MySQL存储过程与存储函数
  5. 网络安全入门:什么是防火墙,防火墙有哪些功能
  6. 商界大忌,你占了几条?
  7. 软件开发过程与项目管理(10.软件项目人员与沟通计划)
  8. 【IPD】IPDPLM
  9. 有哪些好用的设备巡检类的软件?
  10. Apache Kylin(麒麟)