闲话设计模式之建造者模式
风海: 铜锣老兄,我最近买了台不错的电脑诶,你要不要看看配置?
铜锣: 来来,我过目过目。
风海: 你看看啊。
类型 | 配置 |
---|---|
主体 | Intel 天逸510S |
内存 | DDR4 |
视频接口 | VGA/HDMI |
CPU | 4核i3 |
显卡 | 集成 |
硬盘 | 西部数据7200rpm |
输入设备 | 罗技鼠标+硬盘 |
显示器 | 三星xx型号 |
铜锣: 感觉不错嘛,回头拿过来跑跑分。
风海: 其实有一些参数我还没放上来呢,我在想,如果有一天我是负责写代码处理这一块的录入,那我建一个Computer
类岂不是构造函数要包含这么一大坨数据。
铜锣: 啊哈,你这个类真包含这么大坨数据的话,它就是典型的复杂构建问题了。
风海: 哦?那么对于复杂对象的构建,有什么好的解决方案吗?
铜锣: 设计模式倒是有这么一个模式是专门解决这个问题的,叫建造者模式,或者叫生成器模式,还有一些别的译名,不过英文名倒是统一的,叫Builder Pattern
。
风海: 说到创建对象,我们之前也聊过工厂模式,这个建造者模式也负责创建对象,两者有什么区别吗?
铜锣: 当然有区别,工厂模式解决的是类型多样性的问题,建造者模式解决的是类型内部结构复杂性的问题。
风海: 这样,那你以代码为例,如果把我这台电脑写作一个类Computer
,根据客户提供的信息进行个性化配置,那么这个类应该怎么写。
铜锣: 我先从基础写起,比如这样:
class Computer {var body: String = ""var memory: String = ""var description: String {"body = \(body) memory = \(memory)"}
}
风海: 看到了,你写了一个Computer
类,提供了两个属性,然后呢,没看到有Builder
啊。
风海: 别急,这只是起步,我往下写。
class Computer {var body: String = ""var memory: String = ""var description: String {"body = \(body) memory = \(memory)"}static func builder() -> Builder {return Builder()}class Builder {let computer = Computer()@discardableResultfunc set(body: String) -> Builder {computer.body = bodyreturn self}@discardableResultfunc set(memory: String) -> Builder {computer.memory = memoryreturn self}func build() -> Computer {return computer}}
}
现在,我们定义了一个Computer
类,这个类的创建并不由自己完成,而是由Computer
内部的一个Builder
类完成,有意思吧?
风海: 理解了,所以说建造者模式要求复杂的类内部要有个Builder
吗?
铜锣: 哦不不,Builder
具体放在那里不是设计模式规定的,设计模式只是规划了个总体思想,具体实现是由开发者根据实际情况定夺的。
在这个例子里,在我们在创建Computer
对象的时候,可以这么写
let builder = Computer.builder()
builder.set(body: "Intel 天逸510S")
builder.set(memory: "DDR4")
let computer = builder.build()
print("\(computer.description)")
风海: 原来如此,这时候Computer
的创建被延后了,交给Builder
去逐步构建属性,等构建成型后再直接创建Computer
,这么写倒不错,但是代码行数还挺多的。
铜锣: 是的,所以你有没有看到,Builder
的set
代码都会返回Builder
呢,就是为了便捷性,事实上Computer
的创建还可以这么写。
let computer = Computer.builder().set(body: "Intel 天逸510S").set(memory: "DDR4").build()
print("\(computer.description)")
风海: 原来如此,这样确实便捷了很多。所以那个@discardableResult
也是为了单纯属性设置而不打算接收返回值时不会收到编译器警告而设定的。
铜锣: 对,没错。我们还可以进一步扩展,比方说我们通过Builder
来构建Computer
,那么当Builder
不断增加时,我们也可以做一些Builder
模板,比如如下代码:
class HPComputerBuilder: Computer.Builder {override init() {super.init()set(body: "HP 超级芯片").set(memory: "DDR4")}
}
风海: 明白了,这样一来通过单独定义的Builder
类,我们可以非常便捷的直接构建定制的Computer
。
铜锣: 是的。当需要使用时我们这么写:
let hpComputer = HPComputerBuilder().build()
print("\(hpComputer.description)")
风海: 嗯,我们聊了这么多,好像连建造者模式的定义都没给呢。
铜锣: 是啊,定义留给最后嘛。
生成器模式(英:Builder Pattern)是一种设计模式,又名:建造模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。
风海: 好了,三点几了,饮茶去了。
铜锣: 欧耶。
闲话设计模式之建造者模式相关推荐
- 建造者模式java_java设计模式3——建造者模式
java设计模式3--建造者模式 1.建造者模式介绍: 建造者模式属于创建型模式,他提供了一种创建对象得最佳方式 定义: 将一个复杂对象的构建和与它的表示分离,使得同样的构建过程可以创建不同的表示 主 ...
- Java设计模式(建造者模式-适配器模式-桥接模式)
Java设计模式Ⅲ 1.建造者模式 1.1 建造者模式概述 1.2 建造者模式的注意事项和细节 1.3 代码理解 2.适配器模式 2.1 类适配器模式 2.1.1 代码理解 2.2 对象适配器模式 2 ...
- 折腾Java设计模式之建造者模式
博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...
- java设计模式 建造模式_理解java设计模式之建造者模式
理解java设计模式之建造者模式 发布于 2020-12-10| 复制链接 摘记: 建造者模式(Builder Pattern)主要用于"分步骤构建一个复杂的对象",在这其中&qu ...
- 建造者模式 php,PHP设计模式之建造者模式定义与用法简单示例
本文实例讲述了PHP设计模式之建造者模式.分享给大家供大家参考,具体如下: 建造者模式: 将复杂对象的创建过程和表示进行分离(好吧,我也看不懂什么意思1). 来点我人类能听懂的话: 1.在客户端看来需 ...
- C#设计模式之四建造者模式(Builder Pattern)【创建型】
一.引言 今天我们要讲讲Builder模式,也就是建造者模式,当然也有叫生成器模式的,英文名称是Builder Pattern.在现实生活中,我们经常会遇到一些构成比较复杂的物品,比如:电脑,它就是一 ...
- 学习《图说设计模式》建造者模式
图说设计模式之建造者模式 1. 模式动机 无论是在现实世界中还是在软件系统中,都存在一些复杂的对象,它们拥有多个组成部分,如汽车,它包括车轮.方向盘.发送机等各种部件.而对于大多数用户而言,无须知道这 ...
- 实践GoF的23种设计模式:建造者模式
本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:建造者模式>,作者: 元闰子. 简述 在程序设计中,我们会经常遇到一些复杂的对象,其中有很多成员属性,甚至嵌套着多个复杂的对象 ...
- java设计模式之建造者模式(UML类图分析+代码详解)
大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...
最新文章
- Oracle中Hint深入理解(原创)
- Facebook称其新的AI技术可以更快发现仇恨言论
- springboot:spring.profiles.active
- lora发射和接收原理_四个要点,帮你搞定LoRa天线匹配电路
- spring启动过程之源码跟踪(上)--spring Debug
- 原理 快速邻近匹配_论文推荐 | 陈晓勇:低空摄影测量立体影像匹配的现状与展望...
- moldflow2018安装教程
- 【NLP】使用NLP检测和对抗AI假新闻
- js 20160810
- P2183 [国家集训队]礼物(扩展卢卡斯)
- GMQ交易平台大力探索区块链技术,进一步推动产业繁荣
- 自己总结一下wpf image source 绑定的几种方式
- 删除字符串前面的0,00,000。。。
- YOLOV5训练数据(火焰检测)
- URL在线编码/解码工具
- opensuse13.1(x64) ibus 添加五笔失败
- 关于利用Unity制作游戏登陆界面这件事
- 量子计算(十五):半导体量子芯片
- java计算机毕业设计医院远程诊断系统源程序+mysql+系统+lw文档+远程调试
- 职业操盘手的止损法则