第三天:创建型模式--建造者模式
时间:2022-07-24
本文章向大家介绍第三天:创建型模式--建造者模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
零、建造者模式
- 什么是建造者模式 使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于建造者模式,它提供了一种创建对象的最佳方式,将一个复杂对象的构造过程与其表象分离,同一个构造过程可用于创建多个不同的表现。
一、身边的例子
- 麦当劳 麦当劳的汉堡套餐种类有很多(如:汉堡+可乐、汉堡+薯条、汉堡+可乐+薯条),顾客在购买的时候关注的是套餐的种类(表现),而不关注套餐制作的过程(建造过程)。在这里顾客就是客户端,收银员就是指挥者,后厨人员就是建造者。
- django-widgy django-widgy是Django的第三方编辑器扩展,可以构建不同风格的HTML代码。
二、什么情况下使用
创建一个由多个部分构成的对象,而且它的构成需要一步接一步地完成,只有当各个部分都创建好后,这个对象才算创建完成。
三、应用案例
以下代码,通过订购两种不同口味的比萨并,来进一步学习建造者模式
import time
from enum import Enum
PizzaProgress = 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 = 3
class Pizza:
'''
最终产品类
'''
def __init__(self, name):
self.name = name
self.dough = None
self.sauce = None
self.topping = []
def __str__(self):
return self.name
def prepare_dough(self, dough):
self.dough = dough
print('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.preparation
self.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.baking
print('baking your creamy bacon for {} seconds'.format(self.baking_time))
time.sleep(self.baking_time)
self.progress = PizzaProgress.ready
print('your creamy bacon is ready')
class MargaritaBuilder:
'''
玛格丽特比萨建造者
'''
def __init__(self):
self.pizza = Pizza('margarita')
self.progress = PizzaProgress.queued
self.baking_time = 5
def prepare_dough(self):
self.progress = PizzaProgress.preparation
self.pizza.prepare_dough(PizzaDough.thin)
def add_sauce(self):
print('adding the tomato sauce to your margarita...')
self.pizza.sauce = PizzaSauce.tomato
time.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.baking
print('baking your margarita for {} seconds'.format(self.baking_time))
time.sleep(self.baking_time)
self.progress = PizzaProgress.ready
print('your margarita is ready')
class Waiter:
'''
服务员(指挥者)
'''
def __init__(self):
self.builder = None
def construct_pizza(self, builder):
self.builder = builder
[step() for step in (builder.prepare_dough, builder.add_sauce, builder.add_topping, builder.bake)]
@property
def pizza(self):
return self.builder.pizza
def validate_style(builders):
'''
验证输入类
'''
try:
pizza_style = input('What pizza would you like ,[m]argarita or [c]reamy bacon?')
builder = builders[pizza_style]()
vaild_input = True
except 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 = False
while not valid_input:
valid_input, builder = validate_style(builders)
waiter = Waiter()
waiter.construct_pizza(builder)
pizza = waiter.pizza
print('Enjoy your {}!'.format(pizza))
if __name__ == '__main__':
main()
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux等待队列原理与实现
- 微信小程序switchTab带参解决方法
- 微信小程序使用腾讯文档打开文档
- Vue.js属性装饰器库vue-property-decorator文档
- Vue Class Component文档翻译
- Vue使用深度选择器在scoped中修改第三方样式
- Redis Keyspace Notifications(Redis键空间通知)
- NodeJS使用Redis键的过期回调
- 深入Linux并发同步
- JS的页面生命周期事件
- Request请求库被废弃了! 我们该用什么替代?
- 钢材信息小程序开发总结(四) --- 最普通数据大屏
- 前端实现头像转黑白头像
- JS的 if 中的函数声明提升
- vue实现弹框组件