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实例分享:快速查找出被挂马的文件
Jun 08 Python
python简单实现基于SSL的IRC bot实例
Jun 15 Python
简单了解Python中的几种函数
Nov 03 Python
python3.5绘制随机漫步图
Aug 27 Python
对python中的高效迭代器函数详解
Oct 18 Python
Django 通过JS实现ajax过程详解
Jul 30 Python
将Python文件打包成.EXE可执行文件的方法
Aug 11 Python
Centos7 下安装最新的python3.8
Oct 28 Python
python将数组n等分的实例
Dec 02 Python
IDLE下Python文件编辑和运行操作
Apr 25 Python
解决django migrate报错ORA-02000: missing ALWAYS keyword
Jul 02 Python
python小技巧——将变量保存在本地及读取
Nov 13 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
分享五个PHP7性能优化提升技巧
2015/12/07 PHP
浅谈PHP正则中的捕获组与非捕获组
2016/07/18 PHP
PHP如何读取由JavaScript设置的Cookie
2017/03/22 PHP
laravel validate 设置为中文的例子(验证提示为中文)
2019/09/29 PHP
BOOM vs RR BO5 第三场 2.14
2021/03/10 DOTA
[原创]静态页面也可以实现预览 列表不同的显示方式
2006/10/14 Javascript
深入认识javascript中的eval函数
2009/11/02 Javascript
JavaScript 学习笔记(五)
2009/12/31 Javascript
浅析JQuery UI Dialog的样式设置问题
2013/12/18 Javascript
Javascript 数组排序详解
2014/10/22 Javascript
fckeditor粘贴Word时弹出窗口取消的方法
2014/10/30 Javascript
javascript实现延时显示提示框效果
2017/06/01 Javascript
详解Webpack DLL用法以及功能
2017/07/11 Javascript
react+ant design实现Table的增、删、改的示例代码
2018/12/27 Javascript
你了解vue3.0响应式数据怎么实现吗
2019/06/07 Javascript
纯异步nodejs文件夹(目录)复制功能
2019/09/03 NodeJs
Vue 技巧之控制父类的 slot
2020/02/24 Javascript
Chrome插件开发系列一:弹窗终结者开发实战
2020/10/02 Javascript
node.js爬虫框架node-crawler初体验
2020/10/29 Javascript
[48:31]完美世界DOTA2联赛PWL S3 DLG vs Phoenix 第二场 12.17
2020/12/19 DOTA
Python中的map()函数和reduce()函数的用法
2015/04/27 Python
Python做智能家居温湿度报警系统
2018/09/25 Python
Python判断一个三位数是否为水仙花数的示例
2018/11/13 Python
python2与python3的print及字符串格式化小结
2018/11/30 Python
Python 实现opencv所使用的图片格式与 base64 转换
2020/01/09 Python
Docker部署Python爬虫项目的方法步骤
2020/01/19 Python
Python3.7 读取音频根据文件名生成脚本的代码
2020/04/07 Python
解决pycharm编辑区显示yaml文件层级结构遇中文乱码问题
2020/04/27 Python
scrapy利用selenium爬取豆瓣阅读的全步骤
2020/09/20 Python
求高于平均分的学生学号及成绩
2016/09/01 面试题
医学专业毕业生推荐信
2013/11/14 职场文书
仓库管理员岗位职责
2014/03/19 职场文书
朋友聚会祝酒词
2015/08/10 职场文书
三严三实·严以修身心得体会
2016/01/15 职场文书
毕业季聚会祝酒词!
2019/07/04 职场文书
重温经典:乔布斯在斯坦福大学的毕业演讲(双语)
2019/08/26 职场文书