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进阶教程之异常处理
Aug 30 Python
django1.8使用表单上传文件的实现方法
Nov 04 Python
python使用Tesseract库识别验证
Mar 21 Python
Python实现查询某个目录下修改时间最新的文件示例
Aug 29 Python
django小技巧之html模板中调用对象属性或对象的方法
Nov 30 Python
Python设计模式之桥接模式原理与用法实例分析
Jan 10 Python
python datetime中strptime用法详解
Aug 29 Python
python如何求圆的面积
Jul 01 Python
如何真正的了解python装饰器
Aug 14 Python
Python通过类的组合模拟街道红绿灯
Sep 16 Python
Python 使用xlwt模块将多行多列数据循环写入excel文档的操作
Nov 10 Python
Python3爬虫ChromeDriver的安装实例
Feb 06 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
一些php技巧与注意事项分析
2011/02/03 PHP
smarty自定义函数htmlcheckboxes用法实例
2015/01/22 PHP
php采集神器cURL使用方法详解
2016/02/19 PHP
关于PHP中Session文件过多的问题及session文件保存位置
2016/03/17 PHP
PHP 类与构造函数解析
2017/02/06 PHP
PHP实现的大文件切割与合并功能示例
2018/04/10 PHP
为超链接加上disabled后的故事
2010/12/10 Javascript
Jquery选择子控件"大于号"和" "区别介绍及使用示例
2013/06/25 Javascript
javascript时间函数大全
2014/06/30 Javascript
node.js中RPC(远程过程调用)的实现原理介绍
2014/12/05 Javascript
javascript实现详细时间提醒信息效果的方法
2015/03/11 Javascript
jQuery实现多级联动下拉列表查询框
2016/01/18 Javascript
jQuery中ScrollTo用法示例
2016/09/04 Javascript
Bootstrap源码解读模态弹出框(11)
2016/12/28 Javascript
javascript中神奇的 Date对象小结
2017/10/12 Javascript
VUE饿了么树形控件添加增删改功能的示例代码
2017/10/17 Javascript
通过vue-cli来学习修改Webpack多环境配置和发布问题
2017/12/22 Javascript
js保留两位小数方法总结
2018/01/31 Javascript
小程序中设置缓存过期的实现方法
2020/01/14 Javascript
基于vue和bootstrap实现简单留言板功能
2020/05/30 Javascript
在vue中实现给每个页面顶部设置title
2020/07/29 Javascript
vue-cli中实现响应式布局的方法
2021/03/02 Vue.js
[04:29]DOTA2亚洲邀请赛小组赛第一日 TOP10精彩集锦
2015/02/01 DOTA
python使用cStringIO实现临时内存文件访问的方法
2015/03/26 Python
深入理解Python装饰器
2016/07/27 Python
Python列表的切片实例讲解
2019/08/20 Python
python之列表推导式的用法
2019/11/29 Python
Michael Kors美国官网:美式奢侈生活风格的代表
2016/11/25 全球购物
软件缺陷的分类都有哪些
2014/08/22 面试题
教育科学研究生自荐信
2013/10/09 职场文书
法律进社区实施方案
2014/03/21 职场文书
员工生日活动方案
2014/08/24 职场文书
高三复习计划
2015/01/19 职场文书
创业计划书之牛肉汤快餐店
2019/10/08 职场文书
Nginx快速入门教程
2021/03/31 Servers
Python使用MapReduce进行简单的销售统计
2022/04/22 Python