建造者模式

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

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

建造者模式把实现一个类给拆分成多个创建步骤,这些步骤在大多数相关资料中,一般以拟人化的形式进行表达;例如建造者、指挥者以及导演者,但是这些名词的拟人化并不能完全的让读者能够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)

运行结果如下:

设计模式有一定的局限性,具体使用场景得具体分析。

Python3 实现建造者模式相关推荐

  1. GOF23设计模式(创建型模式)建造者模式

    使用场景: 我们要建造一个复杂的产品,比如生产一辆汽车.一部手机,这都是由很多零部件组成的,这时候就需要用到我们的建造者模式,将每个零部件分别生产,然后再装配~~ 以下,我将以一个手机的生产过程为实例 ...

  2. 设计模式 之美 -- 建造者模式

    文章目录 1. 解决问题 2. 应用场景 3. 实现 C语言实现 C++实现 4. 缺点 1. 解决问题 描述如下场景: 类的数据成员很多(8个以上),当我们进行初始化的时候放在初始化列表中,影响类的 ...

  3. 设计模式之建造者模式(生成器模式、Builder)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.FactoryMethod(工厂方法模式):2.Abstract Factory(抽象工厂模式):3.Sin ...

  4. 动态表单构建器——建造者模式

    在编写一个弹出框时,它可以包含确定按钮,取消按钮,标题栏,关闭按钮,最小化按钮,内容,最大化按钮等内容,但这些内容在不同的需求下又不是必须存在的,不同的需求需要对这些组件自由组合,显然每次组合都要重复 ...

  5. Python设计模式-建造者模式

    Python设计模式-建造者模式 代码基于3.5.2,代码如下; #coding:utf-8 #建造者模式 class Burger():name = ""price = 0.0d ...

  6. 设计模式-建造者模式(05)

    定义 建造者模式(Builder Pattern)也叫做生成器模式.英文原话是:Separate the construction of a complex object from its repre ...

  7. php设计模式 - 建造者模式

    为什么80%的码农都做不了架构师?>>>    <?php /*** 建造者模式* * 将一个复杂对象的构建与它的表示分离,使用同样的构建过程可以创建不同的表示 */ clas ...

  8. java中自造类是什么意思_Java建造者模式是什么?如何实现?(附代码)

    本篇文章给大家带来的内容是关于Java建造者模式是什么?如何实现?(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 建造者模式 一.什么是建筑者模式? 建造者模式(Build ...

  9. 建造者模式java_java设计模式3——建造者模式

    java设计模式3--建造者模式 1.建造者模式介绍: 建造者模式属于创建型模式,他提供了一种创建对象得最佳方式 定义: 将一个复杂对象的构建和与它的表示分离,使得同样的构建过程可以创建不同的表示 主 ...

最新文章

  1. php 进程 线程,php进程还是线程
  2. Intellij Idea 导入多个maven项目展示在左侧栏Maven Projects
  3. 走在网页游戏开发的路上(六)
  4. [并发编程] - Executor框架#ThreadPoolExecutor源码解读01
  5. [C# 基础知识梳理系列]专题二:委托的本质论
  6. nearbyserversocket驱动_关于Socket和ServerSocket类详解
  7. Postfix 邮件服务 - 基础服务
  8. .NET Core 3.0 的新改进:针对分布式应用程序的故障诊断和监控
  9. BAT批处理代码快速打开注册表并定位到指定目录
  10. 企业实战02:Oracle数据库的安装和卸载
  11. Android生成keystore方法
  12. 关于建立 Carbon Forum 后 设置访问链接的问题
  13. 电脑当路由使用(目前只在win7上用过)
  14. CNCC2018 即将开幕,报名优惠截止倒计时5天!
  15. thinkphp 前台html调用函数 格式化输出
  16. mysql+复制诊断_诊断Mysql复制问题
  17. php输出mysql查返回行_php-MySQL简单查询返回零行
  18. vim amp; emacs color Scheme
  19. 百度文库资料下载总结技巧
  20. win10家庭版设置护眼色

热门文章

  1. 通过Dapr实现一个简单的基于.net的微服务电商系统(十六)——dapr+sentinel中间件实现服务保护...
  2. NET问答: LINQ 中为啥不能将 StartsWith() 转成 Like('abc%') ?
  3. 玩转git-flow工作流-分支解析
  4. Polly:提升服务可用性
  5. Magicodes.IE Csv导入导出
  6. DotNet SSL TLS证书问题分析排障
  7. 读《持续交付2.0》
  8. .NET Core 3.0 构建和部署
  9. Hyper-V + CentOS7 安装视频教程
  10. WebAssembly和Blazor:解决了一个存在十年的老问题