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基于multiprocessing的多进程创建方法
Jun 04 Python
如何在Python函数执行前后增加额外的行为
Oct 20 Python
python中实现迭代器(iterator)的方法示例
Jan 19 Python
使用python 3实现发送邮件功能
Jun 15 Python
python读取txt文件,去掉空格计算每行长度的方法
Dec 20 Python
Django如何开发简单的查询接口详解
May 17 Python
python PyQt5/Pyside2 按钮右击菜单实例代码
Aug 17 Python
python openvc 裁剪、剪切图片 提取图片的行和列
Sep 19 Python
python实现图片横向和纵向拼接
Mar 05 Python
TensorFlow2.1.0最新版本安装详细教程
Apr 08 Python
django使用JWT保存用户登录信息
Apr 22 Python
python logging通过json文件配置的步骤
Apr 27 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 ADODB生成下拉列表框功能示例
2018/05/29 PHP
对php 判断http还是https,以及获得当前url的方法详解
2019/01/15 PHP
php实现商城购物车的思路和源码分析
2020/07/23 PHP
jquery中对表单的基本操作代码
2010/07/29 Javascript
jqeury-easyui-layout问题解决方法
2014/03/24 Javascript
js取整数、取余数的方法
2014/05/11 Javascript
浅谈javascript 函数内部属性
2015/01/21 Javascript
jquery实现表单验证简单实例演示
2015/11/23 Javascript
JavaScript保留关键字汇总
2015/12/01 Javascript
对象题目的一个坑 理解Javascript对象
2015/12/22 Javascript
js计算系统当前日期是星期几的方法
2016/07/14 Javascript
AngularJS基础 ng-mouseenter 指令示例代码
2016/08/02 Javascript
十大热门的JavaScript框架和库
2017/03/21 Javascript
electron demo项目npm install安装失败的解决方法
2018/02/06 Javascript
Vue实现调节窗口大小时触发事件动态调节更新组件尺寸的方法
2018/09/15 Javascript
JS面试题大坑之隐式类型转换实例代码
2018/10/14 Javascript
vue slot与传参实例代码讲解
2019/04/28 Javascript
js模拟F11页面全屏显示
2019/09/17 Javascript
js实现的在本地预览图片功能示例
2019/11/09 Javascript
浅谈TypeScript的类型保护机制
2020/02/23 Javascript
深入解析微信小程序开发中遇到的几个小问题
2020/07/11 Javascript
Python求两个list的差集、交集与并集的方法
2014/11/01 Python
对pandas的行列名更改与数据选择详解
2018/11/12 Python
python数据处理 根据颜色对图片进行分类的方法
2018/12/08 Python
python实现复制大量文件功能
2019/08/31 Python
30秒学会30个超实用Python代码片段【收藏版】
2019/10/15 Python
pygame实现非图片按钮效果
2019/10/29 Python
Python网络编程之使用TCP方式传输文件操作示例
2019/11/01 Python
vue学习笔记之动态组件和v-once指令简单示例
2020/02/29 Python
Python classmethod装饰器原理及用法解析
2020/10/17 Python
党员对照检查材料
2014/09/22 职场文书
检讨书格式范文
2015/05/07 职场文书
多人股份制合作协议书
2016/03/19 职场文书
解决Nginx 配置 proxy_pass 后 返回404问题
2021/03/31 Servers
Python语言内置数据类型
2022/02/24 Python
三种方式清除vue路由跳转router-link的历史记录
2022/04/10 Vue.js