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根据日期返回星期几的方法
Jul 06 Python
详解Python里使用正则表达式的ASCII模式
Nov 02 Python
使用Selenium破解新浪微博的四宫格验证码
Oct 19 Python
python3 unicode列表转换为中文的实例
Oct 26 Python
Python寻找两个有序数组的中位数实例详解
Dec 05 Python
python pexpect ssh 远程登录服务器的方法
Feb 14 Python
Python3内置模块random随机方法小结
Jul 13 Python
详解用Python为直方图绘制拟合曲线的两种方法
Aug 21 Python
浅谈Tensorflow 动态双向RNN的输出问题
Jan 20 Python
Python Handler处理器和自定义Opener原理详解
Mar 05 Python
Django实现微信小程序支付的示例代码
Sep 03 Python
pytorch加载预训练模型与自己模型不匹配的解决方案
May 13 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 ignore_user_abort与register_shutdown_function 使用方法
2009/06/14 PHP
PHP 远程关机实现代码
2009/11/10 PHP
php递归删除指定文件夹的方法小结
2015/04/20 PHP
深入浅出php socket编程
2015/05/13 PHP
php+ajax实现无刷新分页
2015/11/18 PHP
PHP实现将多个文件压缩成zip格式并下载到本地的方法示例
2018/05/23 PHP
cookie.js 加载顺序问题怎么才有效
2013/07/31 Javascript
jQuery实现contains方法不区分大小写的方法
2015/02/13 Javascript
Javascript的表单验证-初识正则表达式
2016/03/18 Javascript
详细解读Jquery各Ajax函数($.get(),$.post(),$.ajax(),$.getJSON())
2016/08/15 Javascript
nodeJs内存泄漏问题详解
2016/09/05 NodeJs
谈谈JS中常遇到的浏览器兼容问题和解决方法
2016/12/17 Javascript
jQuery序列化后的表单值转换成Json
2017/06/16 jQuery
JavaScript之filter_动力节点Java学院整理
2017/06/28 Javascript
Vue 页面状态保持页面间数据传输的一种方法(推荐)
2018/11/01 Javascript
JavaScript函数式编程(Functional Programming)高阶函数(Higher order functions)用法分析
2019/05/22 Javascript
vue使用原生swiper代码实例
2020/02/05 Javascript
浅谈vue单页面中有多个echarts图表时的公用代码写法
2020/07/19 Javascript
JavaScript 实现继承的几种方式
2021/02/19 Javascript
[10:49]2014国际邀请赛 叨叨刀塔第二期为真正的电竞喝彩
2014/07/21 DOTA
python删除文件示例分享
2014/01/28 Python
Python中decorator使用实例
2015/04/14 Python
linux 下selenium chrome使用详解
2020/04/02 Python
如何在 Matplotlib 中更改绘图背景的实现
2020/11/26 Python
python 基于opencv 绘制图像轮廓
2020/12/11 Python
python利用xpath爬取网上数据并存储到django模型中
2021/02/26 Python
canvas绘制表情包的示例代码
2018/07/09 HTML / CSS
iframe与window.onload如何使用详解
2020/05/07 HTML / CSS
美国最大的香水连锁店官网:Perfumania
2016/08/15 全球购物
三八妇女节活动主持词
2014/03/17 职场文书
企业节能减排实施方案
2014/03/19 职场文书
国窖1573广告词
2014/03/21 职场文书
电子商务求职信
2014/06/15 职场文书
社团活动总结报告
2014/06/27 职场文书
红色影片观后感
2015/06/18 职场文书
Python 用户输入和while循环的操作
2021/05/23 Python