前言

建造者模式也叫生成器模式,是创建一个复杂对象的创建型模式,将此创建过程和部件解耦,使其构建过程和部件的表示分离开。

解释

建造者模式,说白了就是“攒机”。比方说我想要定制一台笔记本电脑,我要求固态必须是2T容量的三星970evo,内存必须是三星的,屏幕也必须是三星的。这里我们只需要把配置、品牌告知商家就行了,至于这台电脑最后怎么组装那就是他们的事了,跟我没关系。

结构图

角色拆解:
1.Director:导演类,安排已有模块的顺序,通知Builder开始建造。
2.Builder:抽象类,规范产品组建,一般由子类完成
3.ConcreteBuilder:具体建造者,实现抽象Builder类定义的所有方法,并返回一个组建好的对象
4.Product:产品类

举栗实现

1.创建Product产品类

这里的产品很明确了,我就要定制一台暗影精灵。有键盘、屏幕…一堆零部件组成

public class Computer {private String keyboard;//键盘private String screen;//屏幕...public void setKeyboard(String keyboard) {this.keyboard = keyboard;}public void setScreen(String screen) {this.screen = screen;}...
}

2.Builder类规范产品组建

铁板熊掌普本身有一套严格规范的生产流水线(也可以理解为是说明书),也就是Builder。键盘、屏幕这些零部件拿过去,就能“攒”好。

//惠普的流水线生产规范
public abstract class Builder {public abstract void buildKeyboard(String keyboard);//安装键盘public abstract void buildScreen(String screen);//安装屏幕//这里省略了一大堆诸如安装固态、内存条、CPU的方法...public abstract Computer create();//组装完成,出厂
}

3.具体建造者ConcreteBuilder

淘宝商家接单了,参照着铁板熊掌普的“说明书”,就开始为我组装暗影精灵了!

//淘宝商家一边看说明书,一边组装
public class TaobaoBuilder extends Builder {private Computer computer = new Computer();@Overridepublic void buildKeyboard(String keyboard) {computer.setKeyboard(keyboard);}@Overridepublic void buildScreen(String screen) {computer.setScreen(screen);}@Overridepublic Computer create() {return computer;}
}

4.Director导演类指挥组装

淘宝商家的“导演类”来规范组装暗影精灵的流程,装了键盘再装屏幕,还有主板…最后齐活了。

//导演负责喊开机
public class Director {Builder builder = null;public Director(Builder builder) {this.builder = builder;}public Computer createComputer(String keyboard,String screen){//规范建造流程builder.buildKeyboard(keyboard);builder.buildScreen(screen);return builder.create();//出厂}
}

5.客户端调用

public class UserClient {public static void main(String []args){TaobaoBuilder taobaoBuilder = new TaobaoBuilder();//淘宝商家Director director = new Director(taobaoBuilder);//淘宝商家的导演类对象//导演命令,生产暗影精灵director.createComputer("razer","samsung");}
}

使用场景

1.创建复杂对象的方法,独立于对象内部的组成零件、组成方式
2.相同的方法,不同的执行顺序,产生不同的结果
3.多个零件被安装到对象中,产出结果不同。体现在“攒机”上,没准一会攒一个顶配暗影精灵,一会攒一个乞丐版
4.产品类十分复杂,或者产品类内部的调用顺序不同产生不同的结果
5.创建一个对象,组建流程是稳定的(说明书),但是内部零件组成千变万化

优缺点

优点
1.用户不需要知道组建的细节,只需要提供配置清单即可
2.具体的建造者类之间相互独立,易扩展。惠普说明书就一份,但是淘宝商家成千上万家
3.具体建造者(淘宝商家)是独立的,可以对建造过程逐步细化,不会对其他模块产生影响
缺点
1.产生对于的导演类和Builder对象

最后说一句

建造者模式在Android开发中也是很重要的,在Android源码和一些知名的开源框架内部就能频繁见到它的身影,比如AlertDialog、ImageLoader、Rxjava…还是那句话,优秀的代码离不开算法和设计模式,希望能帮到大家!

设计模式之建造者模式学习笔记相关推荐

  1. 设计模式之策略模式学习笔记

    前言 我想大家都加班写过"业务代码",一大堆的if else,甚至if里面套if-代码不得已变得十分臃肿,对应的维护成本也有所增加.而策略模式,就是为了解决违反了开放封闭原则的这一 ...

  2. 设计模式之外观模式学习笔记

    简介 外观模式,也叫门面模式.隐藏了系统内部的复杂,向客户端提供了一个接口可以访问. 定义 一个子系统的外部和内部通信,必须通过一个统一的对象.该模式提供一个高层接口,使子系统更易使用. 结构图 角色 ...

  3. 设计模式之代理模式学习笔记

    前言 代理模式,也叫做委托模式.就好比请律师打官司一样,为其他对象提供一种代理,来控制对这个对象的访问. 结构图 接下来我们对以上结构图拆解,进行角色分析: 1.Subject:抽象主题类,声明真实主 ...

  4. 23种设计模式之工厂模式学习笔记

    什么是工厂模式? 工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式.该模式用于封装和管理对象的创建,是一种创 ...

  5. 设计模式之模板模式学习笔记

    前言 相信大家都写过各种各样的文档,需求文档.设计文档.使用手册等等.为了提高复用性和灵活度,需要采用一系列的模板来应对. 定义 定义一个操作中的算法框架,将一些步骤延迟到子类中,使子类不改变一个算法 ...

  6. 学习《图说设计模式》建造者模式

    图说设计模式之建造者模式 1. 模式动机 无论是在现实世界中还是在软件系统中,都存在一些复杂的对象,它们拥有多个组成部分,如汽车,它包括车轮.方向盘.发送机等各种部件.而对于大多数用户而言,无须知道这 ...

  7. C#设计模式之四建造者模式(Builder Pattern)【创建型】

    一.引言 今天我们要讲讲Builder模式,也就是建造者模式,当然也有叫生成器模式的,英文名称是Builder Pattern.在现实生活中,我们经常会遇到一些构成比较复杂的物品,比如:电脑,它就是一 ...

  8. python设计模式之建造者模式

    python设计模式之建造者模式 ​ 建造者模式的适用范围:想要创建一个由多个部分组成的对象,而且它的构成需要一步接一步的完成.只有当各个部分都完成了,这个对象才完整.建造者模式表现为复杂对象的创建与 ...

  9. D5:C#设计模式之四建造者模式(Builder Pattern)【创建型】

    一.引言 今天我们要讲讲Builder模式,也就是建造者模式,当然也有叫生成器模式的,英文名称是Builder Pattern.在现实生活中,我们经常会遇到一些构成比较复杂的物品,比如:电脑,它就是一 ...

最新文章

  1. sql server xp_readerrorlog SQL语句查看错误日志
  2. ArcGIS Server开发教程系列(3)切片
  3. WPF---数据绑定之ValidationRule数据校验综合Demo(七)
  4. OJ1005: 整数幂
  5. Python基础__Python序列基本类型及其操作(1)
  6. js 数据结构中邻接矩阵的图的直观表示
  7. 成龙表演、胡海泉当司仪、张柏芝送礼物,这场婚礼花销7千万 最后倒赚6千万!...
  8. 2.性能之巅 洞悉系统、企业与云计算 --- 方法
  9. javascript设计模式-装饰者模式
  10. java循环制作万年历,JAVA-万年历代码--循环语句
  11. 一篇吃透前置加加和后置加加(附练习题)
  12. 巧用JMP公式,让新变量的生成更简单
  13. java希腊字母表怎么打印_java 命令行窗口输出希腊字母表
  14. 中华石杉的架构学习笔记
  15. 剖析Linux的守护神
  16. 多功能日期查询小工具
  17. Directx11教程四十六之FBX SDK
  18. 通过OpenSSL解析X509证书基本项
  19. 打破微信扫码进群限制,我用webot社群助手是怎么办到的?
  20. 五年程序员谈软件工程师做职业规划的重要性

热门文章

  1. php扩展兼容,PHP扩展迁移为PHP7扩展兼容性问题记录,php7兼容性_PHP教程
  2. c枚举类型enum例题_一篇文章让你详细了解Java中Enum枚举类的使用
  3. webpack4配置详解
  4. Nginx-场景实践篇
  5. 基于AgileEAS.NET SOA 平台SAAS架构技术的开源分销ERP系统-SmartERP.NET下载配置说明
  6. HEVC算法和体系结构:环路滤波技术
  7. 90%的用户都不知道手机内部功能
  8. ActivityGroup是如何对嵌入的Activitys进行管理的
  9. java-mybatis环境搭建
  10. 2019春季学期第三周编程总结