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批量提取word内信息
Aug 09 Python
利用Python如何生成随机密码
Apr 20 Python
python微信跳一跳系列之色块轮廓定位棋盘
Feb 26 Python
python绘制双Y轴折线图以及单Y轴双变量柱状图的实例
Jul 08 Python
python 寻找离散序列极值点的方法
Jul 10 Python
Pycharm和Idea支持的vim插件的方法
Feb 21 Python
python虚拟环境模块venv使用及示例
Mar 04 Python
解决Tensorflow2.0 tf.keras.Model.load_weights() 报错处理问题
Jun 12 Python
如何利用Python动态模拟太阳系运转
Sep 04 Python
django中cookiecutter的使用教程
Dec 03 Python
Python Django搭建文件下载服务器的实现
May 10 Python
解决pytorch 损失函数中输入输出不匹配的问题
Jun 05 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+MySql编写聊天室
2006/10/09 PHP
又十个超级有用的PHP代码片段
2015/09/24 PHP
如何在Web页面上直接打开、编辑、创建Office文档
2007/03/12 Javascript
使用upstart把nodejs应用封装为系统服务实例
2014/06/01 NodeJs
JavaScript strike方法入门实例(给字符串加上删除线)
2014/10/17 Javascript
Jquery实现地铁线路指示灯提示牌效果的方法
2015/03/02 Javascript
jQuery实现的进度条效果
2015/07/15 Javascript
浅谈JavaScript中的apply/call/bind和this的使用
2017/02/26 Javascript
JS实现根据密码长度显示安全条功能
2017/03/08 Javascript
微信小程序template模板实例详解
2017/10/27 Javascript
mpvue微信小程序的接口请求fly全局拦截代码实例
2019/11/13 Javascript
vue项目,代码提交至码云,iconfont的用法说明
2020/07/30 Javascript
[38:39]完美世界DOTA2联赛循环赛 IO vs GXR BO2第二场 11.04
2020/11/05 DOTA
详解Python的Lambda函数与排序
2016/10/25 Python
Python json 错误xx is not JSON serializable解决办法
2017/03/15 Python
Python编程之黑板上排列组合,你舍得解开吗
2017/10/30 Python
Python实现将字符串的首字母变为大写,其余都变为小写的方法
2019/06/11 Python
python如何删除文件中重复的字段
2019/07/16 Python
Django 对象关系映射(ORM)源码详解
2019/08/06 Python
浅谈pytorch grad_fn以及权重梯度不更新的问题
2019/08/20 Python
Django实现分页显示效果
2019/10/31 Python
python模块和包的应用BASE_PATH使用解析
2019/12/14 Python
windows10在visual studio2019下配置使用openCV4.3.0
2020/07/14 Python
CSS3截取字符串实例代码【推荐】
2018/06/07 HTML / CSS
美国时尚配饰品牌:Dooney & Bourke
2017/11/14 全球购物
英国豪华针织品牌John Smedley的在线销售商:The Outlet by John Smedley
2018/04/08 全球购物
什么是唯一索引
2015/07/05 面试题
优秀员工年终发言演讲稿
2014/01/01 职场文书
《我的伯父鲁迅先生》教学反思
2014/02/12 职场文书
业务内勤岗位职责
2015/04/13 职场文书
2015暑期爱心支教策划书
2015/07/14 职场文书
2016干部作风整顿心得体会
2016/01/22 职场文书
MySQL系列之开篇 MySQL关系型数据库基础概念
2021/07/02 MySQL
实现一个简单得数据响应系统
2021/11/11 Javascript
36个正则表达式(开发效率提高80%)
2021/11/17 Javascript
vue3.0 数字翻牌组件的使用方法详解
2022/04/20 Vue.js