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之大话题小函数(2)
Oct 10 Python
python函数装饰器用法实例详解
Jun 04 Python
浅谈使用Python变量时要避免的3个错误
Oct 30 Python
python自动裁剪图像代码分享
Nov 25 Python
详解Python核心对象类型字符串
Feb 11 Python
python数字图像处理之骨架提取与分水岭算法
Apr 27 Python
java中两个byte数组实现合并的示例
May 09 Python
浅谈Python大神都是这样处理XML文件的
May 31 Python
Python3 列表,数组,矩阵的相互转换的方法示例
Aug 05 Python
Python学习笔记之装饰器
Aug 06 Python
解决Django响应JsonResponse返回json格式数据报错问题
Aug 09 Python
Pycharm配置autopep8实现流程解析
Nov 28 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生成静态页面教程
2012/01/10 PHP
PHP防范SQL注入的具体方法详解(测试通过)
2014/05/09 PHP
php生成高清缩略图实例详解
2015/12/07 PHP
对laravel in 查询的使用方法详解
2019/10/09 PHP
use jscript with List Proxy Server Information
2007/06/11 Javascript
javascript与webservice的通信实现代码
2010/12/25 Javascript
基于JQuery实现相同内容合并单元格的代码
2011/01/12 Javascript
jQuery实现360°全景拖动展示
2015/03/18 Javascript
jquery.mousewheel实现整屏翻屏效果
2015/08/30 Javascript
jQuery实现可拖拽的许愿墙效果【附demo源码下载】
2016/09/14 Javascript
浅谈jquery中使用canvas的问题
2016/10/10 Javascript
bootstrap滚动监控器使用方法解析
2017/01/13 Javascript
Vue子组件向父组件通信与父组件调用子组件中的方法
2018/06/22 Javascript
jQuery实现高级检索功能
2019/05/28 jQuery
Vue事件修饰符native、self示例详解
2019/07/09 Javascript
layui使用表格渲染获取行数据的例子
2019/09/13 Javascript
JS函数进阶之prototy用法实例分析
2020/01/15 Javascript
Jquery Datatables的使用详解
2020/01/30 jQuery
基于Vue的侧边目录组件的实现
2020/02/05 Javascript
jquery实现垂直手风琴菜单
2020/03/04 jQuery
JS中FileReader类实现文件上传及时预览功能
2020/03/27 Javascript
jQuery实现移动端笔触canvas电子签名
2020/05/21 jQuery
React实现类似淘宝tab居中切换效果的示例代码
2020/06/02 Javascript
[00:32]2018DOTA2亚洲邀请赛Liquid出场
2018/04/03 DOTA
python实现手机通讯录搜索功能
2018/02/22 Python
Win10 安装PyCharm2019.1.1(图文教程)
2019/09/29 Python
python 已知平行四边形三个点,求第四个点的案例
2020/04/12 Python
西班牙鞋子和箱包在线销售网站:zapatos.es
2020/02/17 全球购物
迪卡侬中国官网:Decathlon中国
2020/08/10 全球购物
保证书格式范文
2014/04/28 职场文书
美德少年事迹材料500字
2014/08/19 职场文书
关于读书的演讲稿800字
2014/08/27 职场文书
2015年初中生自我评价范文
2015/03/03 职场文书
html实现弹窗的实例
2021/06/09 HTML / CSS
python scrapy简单模拟登录的代码分析
2021/07/21 Python
台式电脑蓝牙适配器怎么安装?台式电脑蓝牙适配器安装教程
2022/04/08 数码科技