定义
建造者模式将构造一个复杂对象的构建过程隐藏了起来,使得表面相同的构建过程可以构建不同的表示
- 用户只需指定需要建造的类型就可以得到它们,建造过程及细节不需要知道。
- 类型:创建型
适用场景
- 如果一个对象有非常复杂的内部结构(很多属性)
- 想把复杂对象的创建和使用分离
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。
主要作用
在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象。
- 用户只需要给出指定复杂对象的类型和内容(构建参数);
- 建造者模式负责按顺序创建复杂对象(把内部的建造过程和细节隐藏起来)
解决的问题
- 方便用户创建复杂的对象(不需要知道实现过程)
例子:造汽车 & 买汽车。
- 工厂(建造者模式):负责制造汽车(组装过程和细节在工厂内)
- 汽车购买者(用户):你只需要说出你需要的型号(对象的类型和内容),然后直接购买就可以使用了
- (不需要知道汽车是怎么组装的(车轮、车门、发动机、方向盘等等))
模式原理
UML类图
模式讲解
- 指挥者(Director)直接和客户(Client)进行需求沟通;
- 沟通后指挥者将客户创建产品的需求划分为各个部件的建造请求(Builder);
- 将各个部件的建造请求委派到具体的建造者(ConcreteBuilder);
- 各个具体建造者负责进行产品部件的构建;
- 最终构建成具体产品(Product)
实例
背景
小成希望去电脑城买一台组装的台式主机
- 电脑城老板(Diretor)和小成(Client)进行需求沟通(买来打游戏?学习?) 通用操作,买电脑嘛,只要是用这个,都是买电脑,就属于通用了。
- 了解需求后,电脑城老板将小成需要的主机划分为各个部件(Builder)的建造请求(CPU、主板blabla)
- 如需要 i7-9900,16G内存,RTX2080 (具体背景的特殊操作)
- 指挥装机人员(ConcreteBuilder)去构建组件; 通用操作,因为不管买什么型号器件,都需要这个步骤去构建,只是构建的组件多少不同
- 将组件组装起来成小成需要的电脑(Product) 通用操作,不管买什么型号器件,都需要组装起来
实现步骤
步骤主要分为两类,一类是对于通用背景都需要的,第二类是针对于每次的具体背景的特殊操作
步骤1(背景步骤)
定义产品类
1 | public class Computer{ |
定义抽象建造者,抽象建造者中定义了通用背景中需要用到的方法
1 | public abstract class Builder { |
步骤2:创建具体的建造者(ConcreteBuilder):装机人员
根据具体的应用场景创建具体的建造者,具体的建造者需要继承之前的抽象建造者;由于抽象建造者中我们定义的全是抽象方法,所以具体建造者继承之后,需要单独实现其中的抽象方法。
1 | //装机人员1 |
步骤3、电脑城老板委派任务给装机人员(Director)
这里是具体操作,因为针对这一次的购买,需要指定具体的配件型号与数量
这个例子只要了 CPU、主板和硬盘
1 | public class Director{ |
步骤4、客户端调用-小成到电脑城找老板买电脑
1 | public class Test{ |
对于具体的产品构造,需要Director类做出不同的指令,或者直接在程序入口main方法中根据不同指令使用具体建造者。
一般来说,产品的所有变量属性,都已经被抽象建造者和建造者所包含,所以产品的不同变量组合的具体构造,通过建造者的不同方法就可以构造了。
当产品出现了新的变量属性,就需要改变抽象建造者和建造者了
建造者模式的动机
无论是在现实世界中还是在软件系统中,都存在一些复杂的对象,它们拥有多个组成部分,如汽车,它包括车轮、方向盘、发送机等各种部件。而对于大多数用户而言,无须知道这些部件的装配细节,也几乎不会使用单独某个部件,而是使用一辆完整的汽车,可以通过建造者模式对其进行设计与描述,建造者模式可以将部件和其组装过程分开,一步一步创建一个复杂的对象。用户只需要指定复杂对象的类型就可以得到该对象,而无须知道其内部的具体构造细节。
在软件开发中,也存在大量类似汽车一样的复杂对象,它们拥有一系列成员属性,这些成员属性中有些是引用类型的成员对象。而且在这些复杂对象中,还可能存在一些限制条件,如某些属性没有赋值则复杂对象不能作为一个完整的产品使用;有些属性的赋值必须按照某个顺序,一个属性没有赋值之前,另一个属性可能无法赋值等。
复杂对象相当于一辆有待建造的汽车,而对象的属性相当于汽车的部件,建造产品的过程就相当于组合部件的过程。由于组合部件的过程很复杂,因此,这些部件的组合过程往往被“外部化”到一个称作建造者的对象里,建造者返还给客户端的是一个已经建造完毕的完整产品对象,而用户无须关心该对象所包含的属性以及它们的组装方式,这就是建造者模式的模式动机。
参考
- 本文作者: xczll
- 本文链接: https://xczllgit.github.io/2020/03/07/designPattern/2020-03-07-builder/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!