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中使用dict和set方法的教程
Apr 27 Python
Python利用openpyxl库遍历Sheet的实例
May 03 Python
Python基于win32ui模块创建弹出式菜单示例
May 09 Python
使用numpy和PIL进行简单的图像处理方法
Jul 02 Python
python list转矩阵的实例讲解
Aug 04 Python
python简单贪吃蛇开发
Jan 28 Python
Python语言检测模块langid和langdetect的使用实例
Feb 19 Python
python支持多继承吗
Jun 19 Python
Python 下载Bing壁纸的示例
Sep 29 Python
利用Pycharm + Django搭建一个简单Python Web项目的步骤
Oct 22 Python
Python和Bash结合在一起的方法
Nov 13 Python
Python从MySQL数据库中面抽取试题,生成试卷
Jan 14 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
欧美媒体选出10年前最流行的17部动画
2017/01/18 日漫
php下将图片以二进制存入mysql数据库中并显示的实现代码
2010/05/27 PHP
简单的cookie计数器实现源码
2013/06/07 PHP
php检测网页是否被百度收录的函数代码
2013/10/09 PHP
PHP is_subclass_of函数的一个BUG和解决方法
2014/06/01 PHP
PHP校验15位和18位身份证号的类封装
2018/11/07 PHP
Thinkphp5.0框架的Db操作实例分析【连接、增删改查、链式操作等】
2019/10/11 PHP
js trim函数 去空格函数与正则集锦
2009/11/20 Javascript
兼容ie、firefox的图片自动缩放的css跟js代码分享
2013/08/12 Javascript
javacript获取当前屏幕大小
2016/06/04 Javascript
JavaScript实现九九乘法表的简单实例
2016/06/07 Javascript
详解在AngularJS的controller外部直接获取$scope
2017/06/02 Javascript
jquery select插件异步实时搜索实例代码
2017/10/20 jQuery
基于jquery实现左右上下移动效果
2018/05/02 jQuery
微信小程序websocket实现聊天功能
2020/03/30 Javascript
小程序图片长按识别功能的实现方法
2018/08/30 Javascript
bootstrap-paginator服务器端分页使用方法详解
2020/02/13 Javascript
python和C语言混合编程实例
2014/06/04 Python
python 随机打乱 图片和对应的标签方法
2018/12/14 Python
selenium+python自动化测试之使用webdriver操作浏览器的方法
2019/01/23 Python
Laravel+Dingo/Api 自定义响应的实现
2019/02/17 Python
django框架用户权限中的session缓存到redis中的方法
2019/08/06 Python
python3.6.8 + pycharm + PyQt5 环境搭建的图文教程
2020/06/11 Python
python3的pip路径在哪
2020/06/23 Python
Sentry错误日志监控使用方法解析
2020/11/12 Python
深入了解canvas在移动端绘制模糊的问题解决
2019/04/30 HTML / CSS
英国书籍、CD、DVD和游戏的第一道德零售商:Awesome Books
2020/02/22 全球购物
求职者应聘的自我评价
2013/10/16 职场文书
趣味比赛活动方案
2014/02/15 职场文书
党员民主评议个人总结
2014/10/20 职场文书
敬老院义诊活动总结
2015/05/07 职场文书
健康证明
2015/06/19 职场文书
四大名著读书笔记
2015/06/25 职场文书
上手简单,功能强大的Python爬虫框架——feapder
2021/04/27 Python
详解Laravel服务容器的优势
2021/05/29 PHP
使用logback实现按自己的需求打印日志到自定义的文件里
2021/08/30 Java/Android