Python3实现建造者模式的示例代码


Posted in Python onJune 28, 2020

建造者模式

建造者模式用于创建复杂的对象。使用建造者模式可以使复杂的过程层次明了、清晰,把对象的创建以及使用进行了解耦。实际上从代码的角度上看,是进行了多次封装,使代码结构更为规范合理,层次结构更加鲜明。

在一个复杂的对象中,需要编写大量的代码去实现这一个类,并且在进行初始化时,也有可能会有大量的参数去进行初始化。

建造者模式把实现一个类给拆分成多个创建步骤,这些步骤在大多数相关资料中,一般以拟人化的形式进行表达;例如建造者、指挥者以及导演者,但是这些名词的拟人化并不能完全的让读者能够get到完整的含义。以下将详细讲解这几个角色所需要做的事务。

此篇是一个水文,就用建房子来作为一个简单示例讲解。

首先我们创建一个房子的基类来模拟房子:

class House:#房子基类
  def __init__(self):
    self.size=0
    self.floor=0
    self.garage=0
    self.courtyard=0
  def __str__(self):
    houseInfo='我的房子有'+str(self.size)+'平米,'+str(self.floor)+'层楼,'+str(self.garage)+'个车库'+str(self.courtyard)+'个院子'
    return houseInfo

其中使用 size、floor、garage、courtyard用以记录房子的信息,以便之后工人在建造房子的时候作为记录。
接下来我们建造一个工人类,用来具体去建造我们的房子:

class HouseBuilder:#建造者类工人
  def __init__(self):
    self.house=House()
  def buildGarage(self,amount):
    self.house.garage=amount
    print(self.house)
  def buildFloor(self,amount):
    self.house.floor=amount
    print(self.house)
  def buildSize(self,amount):
    self.house.size=amount
    print(self.house)
  def buildCourtyard(self,amount):
    self.house.courtyard=amount
    print(self.house)

定义了建造size 尺寸占地面积、garage 车库数量、floor 房屋楼层以及 courtyard 庭院数量,并且在这些方法中都传入了一个参数用作设置这些信息。

有了工人后,再来一个包工头,包工头更好的去统筹建造适宜,同时也是跟用户的对接人。

class Foreman:#领班
  def __init__(self):
    self.builder=HouseBuilder()
  def build(self,size,floor,garage,courtyard):#建造步骤
    self.builder.buildSize(size)
    self.builder.buildFloor(floor)
    self.builder.buildGarage(garage)
    self.builder.buildCourtyard(courtyard)

在包工头的初始化函数中,新建一个工人类,也就是房子的建造者,之后定义了一个build方法用于建造,建造时一般为首先确定面积大小,随后建造房屋(楼层),再建造车库以及庭院。

这个时候一个简单的建造者模式就完成了,为了更好的进行说明,我新建了一个User类,这个User类并不需要了解其中具体完成,只需要对接包工头,这个时候告诉包工头我的占地大小,房屋大小以及一些参数后,包工头告诉给他的小弟们,这个时候就可以开始建造了,用户并不需要了解其建造过程。代码如下:

class User():#用户
  def __init__(self,size,floor,garage,courtyard):
    self.frm=Foreman()
    self.frm.build(size,floor,garage,courtyard)

完整代码如下:

class House:#房子基类
  def __init__(self):
    self.size=0
    self.floor=0
    self.garage=0
    self.courtyard=0
  def __str__(self):
    houseInfo='我的房子有'+str(self.size)+'平米,'+str(self.floor)+'层楼,'+str(self.garage)+'个车库'+str(self.courtyard)+'个院子'
    return houseInfo
    
class HouseBuilder:#建造者类工人
  def __init__(self):
    self.house=House()
  def buildGarage(self,amount):
    self.house.garage=amount
    print(self.house)
  def buildFloor(self,amount):
    self.house.floor=amount
    print(self.house)
  def buildSize(self,amount):
    self.house.size=amount
    print(self.house)
  def buildCourtyard(self,amount):
    self.house.courtyard=amount
    print(self.house)

class Foreman:#领班
  def __init__(self):
    self.builder=HouseBuilder()
  def build(self,size,floor,garage,courtyard):#建造步骤
    self.builder.buildSize(size)
    self.builder.buildFloor(floor)
    self.builder.buildGarage(garage)
    self.builder.buildCourtyard(courtyard)

class User():#用户
  def __init__(self,size,floor,garage,courtyard):
    self.frm=Foreman()
    self.frm.build(size,floor,garage,courtyard)

    
xiaoming=User(500,3,2,1)

运行结果如下:

Python3实现建造者模式的示例代码

设计模式有一定的局限性,具体使用场景得具体分析。

到此这篇关于Python3实现建造者模式的示例代码的文章就介绍到这了,更多相关Python3 建造者模式内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python脚本实现下载合并SAE日志
Feb 10 Python
Python检测QQ在线状态的方法
May 09 Python
Python多进程分块读取超大文件的方法
Apr 13 Python
浅谈Python类的__getitem__和__setitem__特殊方法
Dec 25 Python
让python 3支持mysqldb的解决方法
Feb 14 Python
django 将model转换为字典的方法示例
Oct 16 Python
基于Python实现迪杰斯特拉和弗洛伊德算法
May 27 Python
Python API 自动化实战详解(纯代码)
Jun 11 Python
提升Python效率之使用循环机制代替递归函数
Jul 23 Python
Python 使用 prettytable 库打印表格美化输出功能
Dec 26 Python
详解django使用include无法跳转的解决方法
Mar 19 Python
python爬虫scrapy基本使用超详细教程
Feb 20 Python
Python工程师必考的6个经典面试题
Jun 28 #Python
Python drop方法删除列之inplace参数实例
Jun 27 #Python
对python pandas中 inplace 参数的理解
Jun 27 #Python
浅谈PyTorch中in-place operation的含义
Jun 27 #Python
PyTorch之nn.ReLU与F.ReLU的区别介绍
Jun 27 #Python
pytorch 限制GPU使用效率详解(计算效率)
Jun 27 #Python
Pytorch 高效使用GPU的操作
Jun 27 #Python
You might like
造势之举?韩国总统候选人发布《星际争霸》地图
2017/04/22 星际争霸
PHP Socket网络操作类定义与用法示例
2017/08/30 PHP
js不是基础的基础
2006/12/24 Javascript
Prototype使用指南之form.js
2007/01/10 Javascript
javascript数组组合成字符串的脚本
2021/01/06 Javascript
jquery图片放大功能简单实现
2013/08/01 Javascript
简单模拟node.js中require的加载机制
2016/10/27 Javascript
jQuery实现的购物车物品数量加减功能代码
2016/11/16 Javascript
jquery 手势密码插件
2017/03/17 Javascript
Ext JS 实现建议词模糊动态搜索功能
2017/05/13 Javascript
解决JSON.stringify()自动将中文转译成unicode的问题
2018/01/05 Javascript
浅析Proxy可以优化vue的数据监听机制问题及实现思路
2018/11/29 Javascript
浅谈layui 表单元素的选中问题
2019/10/25 Javascript
通过GASP让vue实现动态效果实例代码详解
2019/11/24 Javascript
js Math数学简单使用操作示例
2020/03/13 Javascript
vue3.0 项目搭建和使用流程
2021/03/04 Vue.js
Python Mysql数据库操作 Perl操作Mysql数据库
2009/01/12 Python
python获取从命令行输入数字的方法
2015/04/29 Python
python中lambda与def用法对比实例分析
2015/04/30 Python
使用Mixin设计模式进行Python编程的方法讲解
2016/06/21 Python
Python中xrange与yield的用法实例分析
2017/12/26 Python
Python中pip更新和三方插件安装说明
2018/07/08 Python
解析Python的缩进规则的使用
2019/01/16 Python
对PyQt5的输入对话框使用(QInputDialog)详解
2019/06/25 Python
Jupyter安装拓展nbextensions及解决官网下载慢的问题
2021/03/03 Python
CSS3解析抖音LOGO制作的方法步骤
2019/04/11 HTML / CSS
突袭HTML5之Javascript API扩展5—其他扩展(应用缓存/服务端消息/桌面通知)
2013/01/31 HTML / CSS
AmazeUI 平滑滚动效果的示例代码
2020/08/20 HTML / CSS
屈臣氏俄罗斯在线商店:Watsons俄罗斯
2020/08/03 全球购物
建筑设计所实习生自我鉴定
2013/09/25 职场文书
生日派对邀请函
2014/01/13 职场文书
质量主管工作职责
2014/09/26 职场文书
客房服务员岗位职责
2015/02/09 职场文书
社区党建工作总结2015
2015/05/13 职场文书
员工升职自我评价
2019/03/26 职场文书
SONY AN-LP1 短波有源天线放大器图
2022/04/05 无线电