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 相关文章推荐
Python3基础之函数用法
Aug 13 Python
Python脚本实现下载合并SAE日志
Feb 10 Python
python开发之字符串string操作方法实例详解
Nov 12 Python
Python中的Descriptor描述符学习教程
Jun 02 Python
如何优雅地改进Django中的模板碎片缓存详解
Jul 04 Python
Selenium元素的常用操作方法分析
Aug 10 Python
Python 从列表中取值和取索引的方法
Dec 25 Python
python print输出延时,让其立刻输出的方法
Jan 07 Python
Python数据类型之Set集合实例详解
May 07 Python
Python实现Singleton模式的方式详解
Aug 08 Python
使用python 将图片复制到系统剪贴中
Dec 13 Python
django中url映射规则和服务端响应顺序的实现
Apr 02 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获取目录下所有文件及目录(多种方法)(推荐)
2019/05/14 PHP
php设计模式之策略模式应用案例详解
2019/06/17 PHP
IE 当eval遇上function的处理
2011/08/09 Javascript
JavaScript中数组对象的那些自带方法介绍
2013/03/12 Javascript
js的[defer]和[async]属性
2014/11/24 Javascript
JavaScript实现三阶幻方算法谜题解答
2014/12/29 Javascript
Javascript基础教程之比较操作符
2015/01/18 Javascript
轻松使用jQuery双向select控件Bootstrap Dual Listbox
2015/12/13 Javascript
JavaScript异步上传图片文件的实例代码
2017/07/04 Javascript
运用jQuery写的验证表单(实例讲解)
2017/07/06 jQuery
jQuery 获取除某指定对象外的其他对象 ( :not() 与.not())
2018/10/10 jQuery
vue项目中使用vue-i18n报错的解决方法
2019/01/13 Javascript
使用异步controller与jQuery实现卷帘式分页
2019/06/18 jQuery
nodejs实现百度舆情接口应用示例
2020/02/07 NodeJs
Javascript数组及类数组相关原理详解
2020/10/29 Javascript
详解Vue数据驱动原理
2020/11/17 Javascript
python分析apache访问日志脚本分享
2015/02/26 Python
Python的Django框架中使用SQLAlchemy操作数据库的教程
2016/06/02 Python
Python tkinter模块弹出窗口及传值回到主窗口操作详解
2017/07/28 Python
python实现树形打印目录结构
2018/03/29 Python
Python设计密码强度校验程序
2020/07/30 Python
PyCharm 2020.2.2 x64 下载并安装的详细教程
2020/10/15 Python
关于多种方式完美解决Python pip命令下载第三方库的问题
2020/12/21 Python
NARS化妆品官方商店:美国彩妆品牌
2017/08/26 全球购物
质检员岗位职责
2013/12/17 职场文书
好的演讲稿开场白
2013/12/30 职场文书
机关作风整顿个人整改措施思想汇报
2014/09/29 职场文书
专业见习报告范文
2014/11/03 职场文书
2014年财政局工作总结
2014/12/09 职场文书
2015年党风廉政建设工作总结
2015/04/09 职场文书
学生安全责任协议书
2016/03/22 职场文书
七年级写作指导之游记作文
2019/10/07 职场文书
用Python制作灯光秀短视频的思路详解
2021/04/13 Python
告别网页搜索!教你用python实现一款属于自己的翻译词典软件
2021/06/03 Python
python中Matplotlib绘制直线的实例代码
2021/07/04 Python
golang内置函数len的小技巧
2021/07/25 Golang