零、建造者模式

  • 什么是建造者模式
    使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于建造者模式,它提供了一种创建对象的最佳方式,将一个复杂对象的构造过程与其表象分离,同一个构造过程可用于创建多个不同的表现。

一、身边的例子

  • 麦当劳
    麦当劳的汉堡套餐种类有很多(如:汉堡+可乐、汉堡+薯条、汉堡+可乐+薯条),顾客在购买的时候关注的是套餐的种类(表现),而不关注套餐制作的过程(建造过程)。在这里顾客就是客户端,收银员就是指挥者,后厨人员就是建造者。
  • django-widgy
    django-widgy是Django的第三方编辑器扩展,可以构建不同风格的HTML代码。

二、什么情况下使用

创建一个由多个部分构成的对象,而且它的构成需要一步接一步地完成,只有当各个部分都创建好后,这个对象才算创建完成。

三、应用案例

以下代码,通过订购两种不同口味的比萨并,来进一步学习建造者模式

import time
from enum import EnumPizzaProgress = Enum('PizzaProgress', 'queued preparation baking ready')
PizzaDough = Enum('PizzaDough', 'thin thick')
PizzaSauce = Enum('PizzaSauce', 'tomato creme_fraiche')
PizzaTopping = Enum('PizzaTopping', 'mozzarella double_mozzarella bacon ham mushrooms red_onion oregano')
STEP_DELAY = 3class Pizza:'''最终产品类'''def __init__(self, name):self.name = nameself.dough = Noneself.sauce = Noneself.topping = []def __str__(self):return self.namedef prepare_dough(self, dough):self.dough = doughprint('preparing the {} dough of you {}...'.format(self.dough.name, self))time.sleep(STEP_DELAY)print('done with the {} dough'.format(self.dough.name))class CreamyBaconBuilder:"""奶油熏肉比萨建造者"""def __init__(self):self.pizza = Pizza('creamy bacon')self.progress = PizzaProgress.queued# 烤制时间self.baking_time = 7# 生面团def prepare_dough(self):self.progress = PizzaProgress.preparationself.pizza.prepare_dough(PizzaDough.thin)# 添加沙司def add_sauce(self):print('adding the creme fraiche sauce to your creamy bacon')self.pizza.sauce = PizzaSauce.Creme_fraiche# 暂停3秒,模拟制作的时间time.sleep(STEP_DELAY)print('done with the creme fraiche sauce')# 添加各种配料def add_topping(self):print('adding the topping (mozzarella,bacon,ham,mushrooms,red onion,oregano) to your creamy bacon')self.pizza.topping.append([t for t in (PizzaTopping.mozzarella, PizzaTopping.bacon, PizzaTopping.ham, PizzaTopping.mushrooms,PizzaTopping.red_onion, PizzaTopping.oregano)])time.sleep(STEP_DELAY)print('done with the topping (mozzarella,bacon,ham,mushrooms,red onion, oregano)')# 烤比萨def bake(self):self.progress = PizzaProgress.bakingprint('baking your creamy bacon for {} seconds'.format(self.baking_time))time.sleep(self.baking_time)self.progress = PizzaProgress.readyprint('your creamy bacon is ready')class MargaritaBuilder:'''玛格丽特比萨建造者'''def __init__(self):self.pizza = Pizza('margarita')self.progress = PizzaProgress.queuedself.baking_time = 5def prepare_dough(self):self.progress = PizzaProgress.preparationself.pizza.prepare_dough(PizzaDough.thin)def add_sauce(self):print('adding the tomato sauce to your margarita...')self.pizza.sauce = PizzaSauce.tomatotime.sleep(STEP_DELAY)print('done with the tomato sauce')def add_topping(self):print('adding the topping (double mozzarella, oregano) to your margarita')self.pizza.topping.append([i for i in (PizzaTopping.double_mozzarella, PizzaTopping.oregano)])time.sleep(STEP_DELAY)print('done with the topping (double mozzarrella,oregano)')def bake(self):self.progress = PizzaProgress.bakingprint('baking your margarita for {} seconds'.format(self.baking_time))time.sleep(self.baking_time)self.progress = PizzaProgress.readyprint('your margarita is ready')class Waiter:'''服务员(指挥者)'''def __init__(self):self.builder = Nonedef construct_pizza(self, builder):self.builder = builder[step() for step in (builder.prepare_dough, builder.add_sauce, builder.add_topping, builder.bake)]@propertydef pizza(self):return self.builder.pizzadef validate_style(builders):'''验证输入类'''try:pizza_style = input('What pizza would you like ,[m]argarita or [c]reamy bacon?')builder = builders[pizza_style]()vaild_input = Trueexcept KeyError as err:print('Sorry,only margarita (key m) and creamy bacon (key c) are availabke')return (False, None)return (True, builder)def main():builders = dict(m=MargaritaBuilder, c=CreamyBaconBuilder)valid_input = Falsewhile not valid_input:valid_input, builder = validate_style(builders)waiter = Waiter()waiter.construct_pizza(builder)pizza = waiter.pizzaprint('Enjoy your  {}!'.format(pizza))if __name__ == '__main__':main()

转载于:https://www.cnblogs.com/BMFramework/p/10017255.html

第三天:创建型模式--建造者模式相关推荐

  1. Java设计模式之创建型:建造者模式

    一.什么是建造者模式: 建造者模式将复杂产品的创建步骤分解在在不同的方法中,使得创建过程更加清晰,从而更精确控制复杂对象的产生过程:通过隔离复杂对象的构建与使用,也就是将产品的创建与产品本身分离开来, ...

  2. 设计模式(创建型)之建造者模式(Builder Pattern)

    PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbob ...

  3. 每天学习一个设计模式(九):创建型之建造者模式

    目录 一.基本概念 二.通俗解释 三.建造者模式详解 1.造车的例子 2.建造者模式的结构 3.建造者模式的优点 4.使用场景 5.注意事项 四.建造者模式的扩展和最佳实践 建造者模式的扩展 最佳实践 ...

  4. Java创建型设计模式——建造者模式

    文章目录 1.0概念理解 2.0编码理解 2.1编码说明 2.2编码实现 五种创建型设计模式:工厂方法模式.抽象工厂模式.建造者模式.原型模式.单例模式 1.0概念理解 ​ ​ 一句话理解:建造者模式 ...

  5. java设计模式——创建型之建造者模式

    自大学课程初识设计模式以来,就越发觉得有必要系统学习一下设计模式. 刚好在实习前准备期间课比较少,抽出一点时间整理一下记一些笔记,复制粘贴比较多. 笔记比较适合学习过设计模式的同学. Builder ...

  6. 创建型设计模式——建造者模式

    1.提出问题 假如说,我们需要建房子:这一过程为打桩.砌墙.封顶.房子有各种各样的,比如普通房,高楼,别墅,各种房子的过程虽然一样,但是要求不要相同的.3)请编写程序,完成需求. 传统的想法应该就是下 ...

  7. 【创建型】建造者模式(Builder Pattern)

    主要作用: 可以使多个简单的对象,一步一步构建成一个复杂的对象 应用实例: 1.去肯德基,汉堡.可乐.薯条.炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐". 2.JA ...

  8. 创建型设计模模式---建造者模式

    设计模式 序号 内容 链接地址 1 设计模式七大原则 https://blog.csdn.net/qq_39668819/article/details/115390615 2 创建型设计模式–工厂模 ...

  9. Java设计模式之创建型:原型模式

    一.什么是原型模式: 原型模式主要用于对象的创建,使用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象.UML类图如下: 原型模式的核心是就是原型类 Prototype,Prototype ...

  10. 创建型设计模模式---原型模式

    设计模式 序号 内容 链接地址 1 设计模式七大原则 https://blog.csdn.net/qq_39668819/article/details/115390615 2 创建型设计模式–工厂模 ...

最新文章

  1. tensorflow 加载模型
  2. python一加到二十_46 python学习笔记
  3. lombok时运行编译无法找到get/set方法 看这篇就够了
  4. 高性能Mysql--Schema与数据类型优化
  5. 如何在string.Format方法中输出大括号({})
  6. v-if 的区别v-show
  7. MySQL数据库加密和解密~认证登陆密码(mysql.user)和MySQL不区分大小写
  8. solr学习笔记-linux下配置solr
  9. 关于python提交spark以及在spark环境中使用本地包的方法--针对于集群无法在线下包以及python版本和spark绑定的问题解决
  10. Elastic-Job介绍
  11. 用python删除pdf文件的特定页码
  12. java中后台的跳转_java后台跳转
  13. 小程序引入阿里矢量图
  14. 负整数补码的三种方法
  15. 抢先体验 Ubuntu 22.04 Jammy Jellyfish
  16. SQL Server ansi_null_default | ansi_null_dflt_on
  17. 谁是窃贼(逻辑推理题)
  18. Win10 任务栏透明工具-TranslucentTB
  19. MySQL 用sql语句格式化时间和日期
  20. JAVA知识体系之分布式篇(七)——Redis

热门文章

  1. android 显示 PDF 文件
  2. 最常用的CURL命令大全
  3. 禅道程序员的10条原则
  4. 程序员如何才能提高自己?通过一次重构代码讲解自己的感受【有代码比较】...
  5. 解决docker(ERROR: No such container: )错误
  6. canvas画柱状图 和饼图
  7. Linux LVM 收藏
  8. SM$TS_USED,SM$TS_FREE,SM$TS_AVAIL
  9. iOS常用CGRect的交错,边缘,中心的检测
  10. volatile的用法