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 相关文章推荐
wxpython 最小化到托盘与欢迎图片的实现方法
Jun 09 Python
Python用GET方法上传文件
Mar 10 Python
Python工程师面试题 与Python Web相关
Jan 14 Python
用Python实现命令行闹钟脚本实例
Sep 05 Python
matplotlib设置legend图例代码示例
Dec 19 Python
在PyCharm中三步完成PyPy解释器的配置的方法
Oct 29 Python
python基于FTP实现文件传输相关功能代码实例
Sep 28 Python
python实现数据清洗(缺失值与异常值处理)
Dec 02 Python
python错误调试及单元文档测试过程解析
Dec 19 Python
Pytorch中.new()的作用详解
Feb 18 Python
将python字符串转化成长表达式的函数eval实例
May 11 Python
Python爬虫之爬取哔哩哔哩热门视频排行榜
Apr 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
ThinkPHP多语言支持与多模板支持概述
2014/08/22 PHP
PHP连接Nginx服务器并解析Nginx日志的方法
2015/08/16 PHP
jquery+json实现的搜索加分页效果
2010/03/31 Javascript
js 异步处理进度条
2010/04/01 Javascript
JavaScript在IE和Firefox浏览器下的7个差异兼容写法小结
2010/06/18 Javascript
JS注册/移除事件处理程序(ExtJS应用程序设计实战)
2013/05/07 Javascript
JS实现字体选色板实例代码
2013/11/20 Javascript
jQuery页面加载初始化常用的三种方法
2014/06/04 Javascript
jQuery 和 CSS 的文本特效插件集锦
2014/12/12 Javascript
javascript实现随机读取数组的方法
2015/08/03 Javascript
手机图片预览插件photoswipe.js使用总结
2016/08/25 Javascript
jQuery Ajax前后端使用JSON进行交互示例
2017/03/17 Javascript
浅谈KOA2 Restful方式路由初探
2019/03/14 Javascript
layui自定义验证,用ajax查询后台是否有重复数据,form.verify的例子
2019/09/06 Javascript
Element Cascader 级联选择器的使用示例
2020/07/27 Javascript
基于javascript实现移动端轮播图效果
2020/12/21 Javascript
[14:24]Optic Gaming vs PSG LGD BO3
2018/06/07 DOTA
python两种遍历字典(dict)的方法比较
2014/05/29 Python
Python中MYSQLdb出现乱码的解决方法
2014/10/11 Python
Python列表list数组array用法实例解析
2014/10/28 Python
介绍Python的Django框架中的静态资源管理器django-pipeline
2015/04/25 Python
python模拟登录并且保持cookie的方法详解
2017/04/04 Python
Python3 queue队列模块详细介绍
2018/01/05 Python
Python中分支语句与循环语句实例详解
2018/09/13 Python
python+mysql实现个人论文管理系统
2019/10/25 Python
Python中Subprocess的不同函数解析
2019/12/10 Python
在django中查询获取数据,get, filter,all(),values()操作
2020/08/09 Python
大学生最新职业生涯规划书范文
2014/01/12 职场文书
大学生冰淇淋店商业计划书
2014/01/14 职场文书
《美丽的公鸡》教学反思
2014/02/25 职场文书
法人授权委托书范本
2014/09/17 职场文书
工作作风懒散检讨书
2014/10/29 职场文书
《青山不老》教学反思
2016/02/22 职场文书
2019企业给员工的慰问信
2019/06/24 职场文书
JavaScript与JQuery框架基础入门教程
2021/07/15 Javascript
Java获取e.printStackTrace()打印的信息方式
2021/08/07 Java/Android