前言
建造者模式也叫生成器模式,是创建一个复杂对象的创建型模式,将此创建过程和部件解耦,使其构建过程和部件的表示分离开。
解释
建造者模式,说白了就是“攒机”。比方说我想要定制一台笔记本电脑,我要求固态必须是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…还是那句话,优秀的代码离不开算法和设计模式,希望能帮到大家!