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 相关文章推荐
使用setup.py安装python包和卸载python包的方法
Nov 27 Python
python操作ssh实现服务器日志下载的方法
Jun 03 Python
Python自定义简单图轴简单实例
Jan 08 Python
Python OpenCV 直方图的计算与显示的方法示例
Feb 08 Python
TensorFlow 滑动平均的示例代码
Jun 19 Python
Python画柱状统计图操作示例【基于matplotlib库】
Jul 04 Python
Python用Try语句捕获异常的实例方法
Jun 26 Python
简单了解python反射机制的一些知识
Jul 13 Python
使用python实现男神女神颜值打分系统(推荐)
Oct 31 Python
python机器学习库xgboost的使用
Jan 20 Python
python requests库的使用
Jan 06 Python
Python爬虫定时计划任务的几种常见方法(推荐)
Jan 15 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不用正则采集速度探究总结
2008/03/24 PHP
php数组函数序列之in_array() 查找数组值是否存在
2011/10/29 PHP
PHP函数之日期时间函数date()使用详解
2013/09/09 PHP
php更新mysql后获取改变行数的方法
2014/12/25 PHP
我整理的PHP 7.0主要新特性
2016/01/07 PHP
php基于websocket搭建简易聊天室实践
2016/10/24 PHP
PDO::errorInfo讲解
2019/01/28 PHP
javascript之更有效率的字符串替换
2008/08/02 Javascript
JS表格组件神器bootstrap table详解(基础版)
2015/12/08 Javascript
利用jQuery实现打字机字幕效果实例代码
2016/09/02 Javascript
javascript中apply/call和bind的使用
2017/02/15 Javascript
vue2.0实现倒计时的插件(时间戳 刷新 跳转 都不影响)
2017/03/30 Javascript
客户端(vue框架)与服务器(koa框架)通信及服务器跨域配置详解
2017/08/26 Javascript
vue封装第三方插件并发布到npm的方法
2017/09/25 Javascript
JavaScript定义及输出螺旋矩阵的方法详解
2017/12/01 Javascript
Bootstrap-table自定义可编辑每页显示记录数
2018/09/07 Javascript
微信小程序页面传多个参数跳转页面的实现方法
2019/05/17 Javascript
Python基于递归算法实现的走迷宫问题
2017/08/04 Python
Python 实现引用其他.py文件中的类和类的方法
2018/04/29 Python
利用python如何处理nc数据详解
2018/05/23 Python
Pycharm及python安装详细步骤及PyCharm配置整理(推荐)
2020/07/31 Python
opencv 实现特定颜色线条提取与定位操作
2020/06/02 Python
布鲁明戴尔百货店:Bloomingdale’s
2016/12/21 全球购物
学生打架检讨书大全
2014/01/23 职场文书
服装行业创业计划书范文
2014/02/05 职场文书
厨师长岗位职责
2014/03/02 职场文书
高中生家长寄语大全
2014/04/03 职场文书
学生会竞选演讲稿
2014/04/24 职场文书
学习十八大宣传标语
2014/10/09 职场文书
党员三严三实心得体会
2014/10/13 职场文书
学雷锋献爱心倡议书
2015/04/27 职场文书
仓库管理制度范本
2015/08/04 职场文书
react中的DOM操作实现
2021/06/30 Javascript
Python如何让字典保持有序排列
2022/04/29 Python
JS轻量级函数式编程实现XDM三
2022/06/16 Javascript
mysql sock 文件解析及作用讲解
2022/07/15 MySQL