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的randrange()方法使用教程
May 15 Python
Python实现网络端口转发和重定向的方法
Sep 19 Python
解决Python requests库编码 socks5代理的问题
May 07 Python
使用python生成杨辉三角形的示例代码
Aug 29 Python
Django认证系统实现的web页面实现代码
Aug 12 Python
Pycharm中切换pytorch的环境和配置的教程详解
Mar 13 Python
使用Jupyter notebooks上传文件夹或大量数据到服务器
Apr 14 Python
Python3交互式shell ipython3安装及使用详解
Jul 11 Python
python中如何设置代码自动提示
Jul 15 Python
python编程实现清理微信重复缓存文件
Nov 01 Python
python套接字socket通信
Apr 01 Python
Python matplotlib多个子图绘制整合
Apr 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
Content-type 的说明
2006/10/09 PHP
php 数据库字段复用的基本原理与示例
2011/07/22 PHP
PHP生成不重复标识符的方法
2014/11/21 PHP
ThinkPHP2.x防范XSS跨站攻击的方法
2015/09/25 PHP
php json中文编码为null的解决办法
2016/12/14 PHP
Yii2实现ActiveForm ajax提交
2017/05/26 PHP
不使用浏览器运行javascript代码的方法
2013/07/24 Javascript
jQuery获取Radio,CheckBox选择的Value值(示例代码)
2013/12/12 Javascript
使用jQuery制作遮罩层弹出效果的极简实例分享
2016/05/12 Javascript
Vue.js组件tree实现无限级树形菜单
2016/12/02 Javascript
JS组件系列之MVVM组件 vue 30分钟搞定前端增删改查
2017/04/28 Javascript
ES6解构赋值的功能与用途实例分析
2017/10/31 Javascript
JQuery选中select组件被选中的值方法
2018/03/08 jQuery
vue 多入口文件搭建 vue多页面搭建的实例讲解
2018/03/12 Javascript
详解Webstorm 下的Angular2.0开发之路(图文)
2018/12/06 Javascript
jQuery插件实现非常实用的tab栏切换功能【案例】
2019/02/18 jQuery
在Vue中使用this.$store或者是$route一直报错的解决
2019/11/08 Javascript
vue实现在线学生录入系统
2020/05/30 Javascript
python打包生成的exe文件运行时提示缺少模块的解决方法
2018/10/31 Python
python使用KNN算法识别手写数字
2019/04/25 Python
python3 批量获取对应端口服务的实例
2019/07/25 Python
Python迭代器iterator生成器generator使用解析
2019/10/24 Python
Python实现爬取并分析电商评论
2020/06/19 Python
如何向接受结构参数的函数传入常数值
2016/02/17 面试题
什么是属性访问器
2015/10/26 面试题
《草原的早晨》教学反思
2014/04/08 职场文书
大学社团计划书
2014/05/01 职场文书
网络营销策划方案
2014/06/04 职场文书
医院安全生产月活动总结
2014/07/05 职场文书
大学生党员学习焦裕禄精神思想汇报
2014/09/10 职场文书
无犯罪记录证明范本
2014/09/15 职场文书
会计求职自荐信
2015/03/26 职场文书
卡特教练观后感
2015/06/08 职场文书
公务员学习中国梦心得体会
2016/01/05 职场文书
酒店工程部的岗位职责汇总大全
2019/10/23 职场文书
Redis高级数据类型Hyperloglog、Bitmap的使用
2021/05/24 Redis