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根据京东商品url获取产品价格
Aug 09 Python
Python中import导入上一级目录模块及循环import问题的解决
Jun 04 Python
Python利用IPython提高开发效率
Aug 10 Python
Python数据结构之顺序表的实现代码示例
Nov 15 Python
R语言 vs Python对比:数据分析哪家强?
Nov 17 Python
Python装饰器模式定义与用法分析
Aug 06 Python
PYTHON发送邮件YAGMAIL的简单实现解析
Oct 28 Python
python保存log日志,实现用log日志画图
Dec 24 Python
Django通过json格式收集主机信息
May 29 Python
PyQt5-QDateEdit的简单使用操作
Jul 12 Python
Python wordcloud库安装方法总结
Dec 31 Python
Python接口自动化之文件上传/下载接口详解
Apr 05 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错误抑制符(@)导致引用传参失败Bug的分析
2011/05/02 PHP
Yii实现自动加载类地图的方法
2015/04/01 PHP
PHP常用算法和数据结构示例(必看篇)
2017/03/15 PHP
PHP基于array_unique实现二维数组去重
2020/07/14 PHP
Uglifyjs(JS代码优化工具)入门 安装使用
2020/04/13 Javascript
JS分页效果示例
2013/10/11 Javascript
比较新旧两个数组值得增加和删除的JS代码
2013/10/30 Javascript
使用CSS3的scale实现网页整体缩放
2014/03/18 Javascript
js本地图片预览实现代码
2016/10/09 Javascript
Base64(二进制)图片编码解析及在各种浏览器的兼容性处理
2017/02/09 Javascript
js实现时间轴自动排列效果
2017/03/09 Javascript
es6 字符串String的扩展(实例讲解)
2017/08/03 Javascript
javascript数组拍平方法总结
2018/01/20 Javascript
vue基于两个计算属性实现选中和全选功能示例
2019/02/08 Javascript
JavaScript工具库之Lodash详解
2019/06/15 Javascript
解决Layui当中的导航条动态添加后渲染失败的问题
2019/09/25 Javascript
vue 解决addRoutes多次添加路由重复的操作
2020/08/04 Javascript
[01:10:27]DOTA2-DPC中国联赛正赛 SAG vs XG BO3 第二场 3月5日
2021/03/11 DOTA
python实现的简单抽奖系统实例
2015/05/22 Python
在Django的session中使用User对象的方法
2015/07/23 Python
python使用sqlite3时游标使用方法
2018/03/13 Python
Python selenium环境搭建实现过程解析
2020/09/08 Python
澳大利亚儿童和婴儿产品在线商店:Lime Tree Kids
2017/10/05 全球购物
俄罗斯鲜花递送:AMF
2020/04/24 全球购物
利用promise及参数解构封装ajax请求的方法
2021/03/24 Javascript
幼儿园秋游活动方案
2014/01/21 职场文书
高级销售求职信
2014/02/21 职场文书
优秀实习生感言
2014/03/01 职场文书
五一劳动节演讲稿
2014/09/12 职场文书
村委会贫困证明范本
2014/09/17 职场文书
2014收银员工作总结范文
2014/12/16 职场文书
安全温馨提示语大全
2015/07/14 职场文书
2015教师节通讯稿
2015/07/20 职场文书
小学副班长竞选稿
2015/11/21 职场文书
 分享一个Python 遇到数据库超好用的模块
2022/04/06 Python
MySQL三种方式实现递归查询
2022/04/18 MySQL