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 排列组合之itertools
Mar 20 Python
Python socket网络编程TCP/IP服务器与客户端通信
Jan 05 Python
使用Python3+PyQT5+Pyserial 实现简单的串口工具方法
Feb 13 Python
python实现转圈打印矩阵
Mar 02 Python
Python学习笔记之For循环用法详解
Aug 14 Python
numpy:找到指定元素的索引示例
Nov 26 Python
pytorch中的transforms模块实例详解
Dec 31 Python
pytorch之Resize()函数具体使用详解
Feb 27 Python
Python object类中的特殊方法代码讲解
Mar 06 Python
keras 简单 lstm实例(基于one-hot编码)
Jul 02 Python
Python爬虫入门教程02之笔趣阁小说爬取
Jan 24 Python
Python的collections模块真的很好用
Mar 01 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 翻页 实例代码
2009/08/07 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十三)
2014/06/26 PHP
php判断用户是否手机访问代码
2015/06/08 PHP
php结合web uploader插件实现分片上传文件
2016/05/10 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
PHP中命名空间的使用例子
2019/03/22 PHP
你的编程语言可以这样做吗?
2006/09/07 Javascript
javascript当onmousedown、onmouseup、onclick同时应用于同一个标签节点Element
2010/01/05 Javascript
jQuery Tools tab使用介绍
2012/07/14 Javascript
JS控制伪元素的方法汇总
2016/04/06 Javascript
JavaScript实现页面无操作倒计时退出
2016/10/22 Javascript
Angular.Js之Scope作用域的学习教程
2017/04/27 Javascript
微信分享调用jssdk实例
2017/06/08 Javascript
详解.vue文件中监听input输入事件(oninput)
2017/09/19 Javascript
详解nodejs 配置文件处理方案
2019/01/02 NodeJs
浅谈实现在线预览PDF的几种解决办法
2020/08/10 Javascript
Python文档生成工具pydoc使用介绍
2015/06/02 Python
深入理解NumPy简明教程---数组2
2016/12/17 Python
对python while循环和双重循环的实例详解
2019/08/23 Python
Python基础进阶之海量表情包多线程爬虫功能的实现
2020/12/17 Python
纯css3无js实现的Android Logo(有简单动画)
2013/01/21 HTML / CSS
纯CSS3实现手风琴风格菜单具体步骤
2013/05/06 HTML / CSS
HTML5-WebSocket实现聊天室示例
2016/12/15 HTML / CSS
html5超简单的localStorage实现记住密码的功能实现
2017/09/07 HTML / CSS
使用PDF.JS插件在HTML中预览PDF文件的方法
2018/08/29 HTML / CSS
市场营销专业个人求职信范文
2013/12/14 职场文书
公益活动策划方案
2014/01/09 职场文书
2014年小学植树节活动方案
2014/03/02 职场文书
办公自动化毕业生求职信
2014/03/09 职场文书
函授本科个人自我鉴定
2014/03/25 职场文书
专家推荐信模板
2014/05/09 职场文书
群众路线班子对照检查材料
2014/09/25 职场文书
2014年林业工作总结
2014/12/05 职场文书
文明家庭事迹材料
2014/12/20 职场文书
找规律教学反思
2016/02/23 职场文书
七年级作文之英语老师
2019/10/28 职场文书