Python3 实现建造者模式

建造者模式

建造者模式用于创建复杂的对象。使用建造者模式可以使复杂的过程层次明了、清晰,把对象的创建以及使用进行了解耦。实际上从代码的角度上看,是进行了多次封装,使代码结构更为规范合理,层次结构更加鲜明。

在一个复杂的对象中,需要编写大量的代码去实现这一个类,并且在进行初始化时,也有可能会有大量的参数去进行初始化。

建造者模式把实现一个类给拆分成多个创建步骤,这些步骤在大多数相关资料中,一般以拟人化的形式进行表达;例如建造者、指挥者以及导演者,但是这些名词的拟人化并不能完全的让读者能够get到完整的含义。以下将详细讲解这几个角色所需要做的事务。

此篇是一个水文,就用建房子来作为一个简单示例讲解。

首先我们创建一个房子的基类来模拟房子:

class House:#房子基类def __init__(self):self.size=0self.floor=0self.garage=0self.courtyard=0def __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=amountprint(self.house)def buildFloor(self,amount):self.house.floor=amountprint(self.house)def buildSize(self,amount):self.house.size=amountprint(self.house)def buildCourtyard(self,amount):self.house.courtyard=amountprint(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=0self.floor=0self.garage=0self.courtyard=0def __str__(self):houseInfo='我的房子有'+str(self.size)+'平米,'+str(self.floor)+'层楼,'+str(self.garage)+'个车库'+str(self.courtyard)+'个院子'return houseInfoclass HouseBuilder:#建造者类工人def __init__(self):self.house=House()def buildGarage(self,amount):self.house.garage=amountprint(self.house)def buildFloor(self,amount):self.house.floor=amountprint(self.house)def buildSize(self,amount):self.house.size=amountprint(self.house)def buildCourtyard(self,amount):self.house.courtyard=amountprint(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)

运行结果如下:
在这里插入图片描述
设计模式有一定的局限性,具体使用场景得具体分析。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/288077.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系列网络服务器机柜,什么是网络机柜 网络机柜和服务器机柜有哪些区别【详解】...

【网络机柜】什么是网络机柜 网络机柜和服务器机柜区别服务器机柜和网络机柜的区别服务器机柜 :用来组合安装面板、插件、插箱、电子元件、器件和机械零件与部件,使其构成一个整体的安装箱。可以配置:专用固定托盘、专用滑动托盘、电源插排、…

JS解析url

使用js解析url ,返回一个对象&#xff0c;使用函数&#xff1a; <script type"text/javascript"> var url"www.taobao.com?key0a&key1b&key2c"; function parseQueryString(url){var strurl.split("?")[1],itemsstr.split("…

Android SDK 目录说明

Android SDK目录说明: AVD Manager.exe&#xff1a;虚拟机管理工具 SDK Manager.exe&#xff1a;sdk管理工具 tools目录&#xff1a;包括测试、调试、第三方工具。模拟器、数据管理工具等。 build-tools目录&#xff1a;编译工具目录&#xff0c;包含了转化为davlik虚拟机的编译…

【3D Max】3D max如何删除环境贴图

问题描述&#xff1a;在用3dm max贴图的时候&#xff0c;如果不选中对象&#xff0c;很容易将图贴到背景环境中去&#xff0c;情况如下所示&#xff1a; 解决办法有二&#xff1a; 一、不参与渲染 快捷键8&#xff0c;在“环境和效果”窗口中去掉“使用贴图”前面的√。 二、…

剑指offer之求二叉树中两个节点的最低共同父节点

1 问题 求二叉树中俩个节点的最低共同父节点&#xff0c;比如二叉树如下 42 61 3 5 7 比如节点1和3两个节点的最低共同父节点是2&#xff0c;节点3和5两个节点的最低共同父节点是4,节点5和6两个节点的最低共同父节点是6, 也有可能其中1个节点或者2个节点不…

C#语法糖系列 —— 第四篇:聊聊 Span 的底层玩法

把 Span 归于语法糖&#xff0c;可能有些偏了&#xff0c;但偏了就偏了&#xff0c;哈哈&#xff0c;只要是分享就好&#xff0c;C# 发展至今&#xff0c;已经是一门非常重的语言了&#xff0c;所有想要的它都要&#xff0c;即可以&#xff1a;面向过程编程面向对象编程面向函数…

hdu 1556 Color the ball 线段树 区间更新

水一下 #include <bits/stdc.h> #define lson l, m, rt<<1 #define rson m1, r, rt<<1|1 using namespace std;const int MAXN 111111; int sum[MAXN<<2]; int n;void push_down(int rt, int len) {if(sum[rt] 0) return;sum[rt<<1] sum[rt];…

【ArcGIS风暴】河流水系左斜体样式经典设置方法

目录 一、效果预览 二、实现方法 一、效果预览 河流水系在作图时一般设置为左斜体、蓝色,如黄河、青海湖、洮河等,如下图所示: 二、实现方法 下面介绍在ArcGIS 10.5中的实现方法。 1、ArcGIS设置方法 绘图工具添加文字或者将标注转为注记,双击,打开属性,点击更改符号…

mlp 参数调优_积神经网络(CNN)的参数优化方法

积神经网络(CNN)的参数优化方法from&#xff1a;http://blog.csdn.net/u010900574/article/details/51992156著名&#xff1a; 本文是从 Michael Nielsen的电子书Neural Network and Deep Learning的深度学习那一章的卷积神经网络的参数优化方法的一些总结和摘录&#xff0c;并…

HBase简介(很好的梳理资料)

HBase HBaseHadoop网络应用数据结构NoSQL 一、 简介 history started by chad walters and jim 2006.11 G release paper on BigTable 2007.2 inital HBase prototype created as Hadoop contrib 2007.10 First useable Hbase 2008.1 Hadoop become Apache top-level project …

python 实现原型设计模式

原型设计模式主要在当新建一个对象的时候&#xff0c;觉得很麻烦&#xff0c;并且你又要保留当前对象。在这种情况下使用原型设计模式是一个很好的解决办法。 例如你写一个东西更新&#xff0c;不同的版本&#xff0c;这个时候以前的版本肯定要保留&#xff0c;并且从此基础上…

装服务器显示磁盘脱机,服务器磁盘处于脱机

服务器磁盘处于脱机 内容精选换一换配置目的端或启动目的端时提示“SMS.1311 目的端磁盘个数不够”。在配置目的端服务器过程中&#xff0c;会校验目的端磁盘数量是否和源端一致。当出现该错误时&#xff0c;检查目的端服务器磁盘数量是否少于源端服务器磁盘数量&#xff0c;或…

百度第三方登录

首先第三方应用要跟微信帐号合作&#xff0c;然后按照下面的方法操作&#xff1a; 目前&#xff0c;百度OAuth2.0支持五种获取Access Token的流程和一种刷新获取AccessToken方式&#xff0c;第三方可根据需求选取合适的方式&#xff1a; 百度授权的Access Token是有有效期的&am…

剑指offer之重建二叉树

1 问题 重建二叉树&#xff1a;给定二叉树的先序遍历&#xff08;根左右&#xff09;和中序&#xff08;左中右&#xff09;遍历结果&#xff0c;建立这棵二叉树。输入保证二叉树无重复结点 以先序{1, 2, 4, 7, 3, 5, 6, 8}和中序{4, 7, 2, 1, 5, 3, 8, 6}为例 2 分析 先序遍…

ArcGIS 10.5专题地图制作自定义漂亮图框

先来看一下效果: 下面来说明如何在ArcGIS软件里面实现自定义图框。 1. 【自定义】→【样式管理器】→【Administrator.style】→【边框】→【新建】→【常规边框】。 2. 点击【更改符号】。 3. 点击【编辑符号】。

当我会AOP之后,去丈母娘家都是挺着胸脯!

当和朋友谈到AOP时&#xff0c;第一映像会说AOP的应用层面&#xff0c;比如拦截器、过滤器&#xff0c;实现复用等等使用层面上。这些应用层面上的回答远远没有深入AOP的思想。是的&#xff0c;AOP是思想&#xff0c;面向切面思想。既然是编程思想&#xff0c;那我们就有必要了…

Ubuntu系统备份工具大全(官方整理推荐)

其实官方在系统备份这块已经有Wiki整理和收集各类实用的工具。以下是翻译自官方Wiki的部分文档&#xff1a; 备份工具 wiki文档实用程序 工具 界面 格式类型 Raw/File 支持 远程 增量 差异 自动化 Dj Dup 图形&#xff08;集成到系统工具&#xff09; File 是 是 …

python 最简单的实现适配器设计模式

适配器设计模式是懒得改动某些代码&#xff0c;或者某些接口不方便改动的时候&#xff0c;使用一个特定的封装&#xff0c;一些特定的编写办法&#xff0c;使不同的接口可以使用同种调用方式使用。 更简单的说话则是&#xff0c;例如几个不同的接口 aliyun、qiniuyun、tencent…

Envi和ArcGIS软件打开和处理.NC4数据

NC4是NetCDF-4的简缩形式。 NetCDF(network Common Data Form)网络通用数据格式是由美国大学大气研究协会(University Corporation for Atmospheric Research,UCAR)的Unidata项目科学家针对科学数据的特点开发的,是一种面向数组型并适于网络共享的数据的描述和编码标准。目…

cocos2d-x 3.0rc2中读取sqlite文件

cocos2d-x 3.0rc2中读取sqlite文件的方式&#xff0c;在Android中直接读取软件内的会失败。须要复制到可写的路径下 sqlite3* dbFile NULL;std::string path;path FileUtils::getInstance()->fullPathForFilename("db1.db");#if CC_TARGET_PLATFORM CC_PLATFOR…