博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python-建造者模式
阅读量:5813 次
发布时间:2019-06-18

本文共 3547 字,大约阅读时间需要 11 分钟。

源码地址:

说明:

假如要组装一台电脑,将主板,CPU,内存等部件按照某个稳定的步骤组合,基本过程是不变的,而组成电脑的各个部件却可以是不同性能的,不同价位,或者是不同版本的,当组成电脑的时只需要选择不同的组件就可以按照基本相同的过程造出不同配置的电脑。也就是说建造者模式的意图是将一个复杂对象的构建过程与表示分离,它使用相同的构建步骤作用于不同的子对象以构建出不同表现形式的“复杂对象”。

实例:

从订单的角度构建一个快餐点餐系统

class Burger():    """    主食类,价格名字    """    name=""    price=0.0    def getPrice(self):        return self.price    def setPrice(self,price):        self.price=price    def getName(self):        return self.nameclass cheeseBurger(Burger):    """    奶酪汉堡    """    def __init__(self):        self.name="cheese burger"        self.price=10.0class spicyChickenBurger(Burger):    """    香辣鸡汉堡    """    def __init__(self):        self.name="spicy chicken burger"        self.price=15.0class Snack():    """    小食类,价格以及名字    """    name = ""    price = 0.0    type = "SNACK"    def getPrice(self):        return self.price    def setPrice(self, price):        self.price = price    def getName(self):        return self.nameclass chips(Snack):    """    炸薯条    """    def __init__(self):        self.name = "chips"        self.price = 6.0class chickenWings(Snack):    """    鸡翅    """    def __init__(self):        self.name = "chicken wings"        self.price = 12.0class Beverage():    """    饮料    """    name = ""    price = 0.0    type = "BEVERAGE"    def getPrice(self):        return self.price    def setPrice(self, price):        self.price = price    def getName(self):        return self.nameclass coke(Beverage):    """    可乐    """    def __init__(self):        self.name = "coke"        self.price = 4.0class milk(Beverage):    """    牛奶    """    def __init__(self):        self.name = "milk"        self.price = 5.0class order():    """    订单对象,一个订单中包含一份主食,一份小食,一份饮料    """    burger=""    snack=""    beverage=""    def __init__(self,orderBuilder):        self.burger=orderBuilder.bBurger        self.snack=orderBuilder.bSnack        self.beverage=orderBuilder.bBeverage    def show(self):        print("Burger:%s"%self.burger.getName())        print("Snack:%s"%self.snack.getName())        print("Beverage:%s"%self.beverage.getName())# 建造者class orderBuilder():    """    orderBuilder就是建造者模式中所谓的“建造者”,    将订单的建造与表示相分离,以达到解耦的目的。    在上面订单的构建过程中,如果将order直接通过参数定义好(其构建与表示没有分离),    同时在多处进行订单生成,此时需要修改订单内容,    则需要一处处去修改,业务风险也就提高了不少。    """    bBurger=""    bSnack=""    bBeverage=""    def addBurger(self,xBurger):        self.bBurger=xBurger    def addSnack(self,xSnack):        self.bSnack=xSnack    def addBeverage(self,xBeverage):        self.bBeverage=xBeverage    def build(self):        return order(self)# Director类class orderDirector():    """    在建造者模式中,还可以加一个Director类,用以安排已有模块的构造步骤。    对于在建造者中有比较严格的顺序要求时,该类会有比较大的用处。    """    order_builder=""    def __init__(self,order_builder):        self.order_builder=order_builder    def createOrder(self,burger,snack,beverage):        self.order_builder.addBurger(burger)        self.order_builder.addSnack(snack)        self.order_builder.addBeverage(beverage)        return self.order_builder.build()#场景实现if  __name__=="__main__":    order_builder=orderBuilder()    order_builder.addBurger(spicyChickenBurger())    order_builder.addSnack(chips())    order_builder.addBeverage(milk())    order_1=order_builder.build()    order_1.show()

执行结果:

Burger:spicy chicken burger

Snack:chips
Beverage:milk

优点:

使得产品内部表象可以独立的变化,使得客户不必知道产品内部的组成细节。对构建过程更加精细控制,将构建代码和表示代码分开。

缺点:

难以应对”分步骤构建算法“的需求变动。

适用性:

1、需要生成的产品有复杂的内部结构

2、需要生成的产品对象的属性相互依赖,建造者模式可以强破生成顺序。

参考链接:https://yq.aliyun.com/articles/70416?spm=a2c4e.11155435.0.0.495838daVpgS2g

 

转载于:https://www.cnblogs.com/welan/p/9124081.html

你可能感兴趣的文章
FreeMarker-Built-ins for strings
查看>>
验证DataGridView控件的数据输入
查看>>
POJ1033
查看>>
argparse - 命令行选项与参数解析(转)
查看>>
一维数组
查看>>
Linux学习笔记之三
查看>>
CentOS 6.6 FTP install
查看>>
图解Ajax工作原理
查看>>
oracle导入导出小记
查看>>
聊一聊log4j2配置文件log4j2.xml
查看>>
NeHe OpenGL教程 第七课:光照和键盘
查看>>
修改上一篇文章的node.js代码,支持默认页及支持中文
查看>>
Php实现版本比较接口
查看>>
删除设备和驱动器中软件图标
查看>>
第四章 TCP粘包/拆包问题的解决之道---4.1---
查看>>
html语言
查看>>
从源码看集合ArrayList
查看>>
spring-boot支持websocket
查看>>
菜鸟笔记(一) - Java常见的乱码问题
查看>>
我理想中的前端工作流
查看>>