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中__call__用法实例
Aug 29 Python
Python遍历文件夹和读写文件的实现代码
Aug 28 Python
Python+MongoDB自增键值的简单实现
Nov 04 Python
Python复制Word内容并使用格式设字体与大小实例代码
Jan 22 Python
Python3中的json模块使用详解
May 05 Python
Python编程图形库之Pillow使用方法讲解
Dec 28 Python
PowerBI和Python关于数据分析的对比
Jul 11 Python
Python学习笔记之列表推导式实例分析
Aug 13 Python
Python3 使用selenium插件爬取苏宁商家联系电话
Dec 23 Python
jupyter notebook插入本地图片的实现
Apr 13 Python
Python如何截图保存的三种方法(小结)
Sep 01 Python
健身房被搭讪?用python写了个小米计时器助人为乐
Jun 08 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/06/09 PHP
php设计模式 Chain Of Responsibility (职责链模式)
2011/06/26 PHP
记录一次排查PHP脚本执行卡住的问题
2016/12/27 PHP
BOOM vs RR BO5 第三场 2.14
2021/03/10 DOTA
javascript实现二分查找法实现代码
2007/11/12 Javascript
extjs 学习笔记(二) Ext.Element类
2009/10/13 Javascript
javascript小数计算出现近似值的解决办法
2010/02/06 Javascript
ExtJs设置GridPanel表格文本垂直居中示例
2013/07/15 Javascript
node.js中的fs.rmdir方法使用说明
2014/12/16 Javascript
Javascript获取数组中的最大值和最小值的方法汇总
2016/01/01 Javascript
jQuery扩展实现text提示还能输入多少字节的方法
2016/11/28 Javascript
Javascript实现一个简单的输入关键字添加标签效果实例
2017/06/01 Javascript
浅谈Node.js ORM框架Sequlize之表间关系
2017/07/24 Javascript
详解JavaScript的BUG和错误
2018/05/07 Javascript
layui点击按钮添加可编辑的一行方法
2018/08/15 Javascript
vue element 生成无线级左侧菜单的实现代码
2019/08/21 Javascript
jquery.validate自定义验证用法实例分析【成功提示与择要提示】
2020/06/06 jQuery
[03:24]DOTA2超级联赛专访hao 大翻盘就是逆袭
2013/05/24 DOTA
[55:35]VGJ.S vs Mski Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
[01:01:22]VGJ.S vs OG 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
Linux下为不同版本python安装第三方库
2016/08/31 Python
numpy中的ndarray方法和属性详解
2019/05/27 Python
python实现发送form-data数据的方法详解
2019/09/27 Python
基于python3抓取pinpoint应用信息入库
2020/01/08 Python
Python实现序列化及csv文件读取
2020/01/19 Python
python读取当前目录下的CSV文件数据
2020/03/11 Python
浅谈python处理json和redis hash的坑
2020/07/16 Python
基于Django集成CAS实现流程详解
2020/11/28 Python
Java面试题及答案
2012/09/08 面试题
计算机大学生的自我评价
2013/10/15 职场文书
亮化工程实施方案
2014/03/17 职场文书
爱国卫生月活动总结范文
2014/04/25 职场文书
爱国主义教育演讲稿
2014/08/26 职场文书
商务考察邀请函模板
2015/02/02 职场文书
2015年度优秀员工自荐书
2015/03/06 职场文书
MySQL 服务和数据库管理
2021/11/11 MySQL