建造者模式(Builder)
1.定义:
将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。
2.使用:
- 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
- 当构造过程必须允许被构造的对象有不同表示时
3.组成:
- builder:建造工具抽象——为创建一个产品对象的各个部件指定抽象接口。
- ConcreteBuilder:建造工具——实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并提供一个检索产品的接口。
- Director:建造者——构造一个使用Builder接口的对象。
- Product:产品——表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
- 调用者。
不要纠结,以上的文字都是我百度的,我也写不出这些高大上的语句。对于我这种白银的渣渣,还是用一些通俗易懂的语句来慢慢学完设计模式。
好,上面那么多文字,最重要的是第三点组成。现在就很重要了,记住这么一句话:调用者叫建造者用不同的建造工具造出不同产品。言简意赅,可以了,看代码更透彻,代码就是世界的语言呀。
4.code:
1.产品类 —— product :
class Phone {
private String battery;// 电池
private String screen;// 屏幕
private String camera;// 相机
public String getBattery() {
return battery;
}
public String getScreen() {
return screen;
}
public String getCamera() {
return camera;
}
public void setBattery(String battery) {
this.battery = battery;
}
public void setScreen(String screen) {
this.screen = screen;
}
public void setCamera(String camera) {
this.camera = camera;
}
public void showInfo() {
System.out.println("电池容量:" + battery + " | 屏幕尺寸:" + screen + " | 相机像素:" + camera);
}
}
怎么不能折叠呀,不过代码看着多,但都是get / set 稍微瞄一下就懂了,接下来就抽象了。
2.建造工具的抽象接口 —— Builder :
// 建造工具抽象接口 - Builder
interface Builder {
void buildBattery();
void buildScreen();
void buildCamera();
Phone assemblePhone();//组装手机
}
3.建造工具类 —— conreteBuilder :
// 魅蓝2建造工具类 - conreteBuilder
class MeiBlue2Builder implements Builder {
Phone meiblue2 = new Phone();
public void buildBattery() {
meiblue2.setBattery("2500mAh");
}
public void buildScreen() {
meiblue2.setScreen("5 英寸");
}
public void buildCamera() {
meiblue2.setCamera("1300万像素");
}
public Phone assemblePhone() {
return meiblue2;
}
}
// Iphone6S建造工具类 - conreteBuilder
class Iphone6sBuilder implements Builder {
Phone iphone6s = new Phone();
public void buildBattery() {
iphone6s.setBattery("1715mAh");
}
public void buildScreen() {
iphone6s.setScreen("4.7英寸");
}
public void buildCamera() {
iphone6s.setCamera("1200万像素");
}
public Phone assemblePhone() {
return iphone6s;
}
}
看着配置魅蓝2都分分钟虐杀 Iphone6s呀。而且价格差不多才 1/10 想想就好激动。
所以,这个建造工具类才是核心,起到承上启下的作用。看代码,我们有两个建造工具类,一个我刚买的魅蓝2,另一个配置渣渣的IPhone6s,他们都实现了建造手机这一接口,并且在制造电池,屏幕,相机的时候都写入了配置,只要在组装手机这一步,就可以获得完整的手机了。那我们就看看建造者怎么用它们。
4.建造者 —— Director
// 建造者 - Director
class BuilderMan {
public static Phone buildPhone(Builder builder) {
builder.buildBattery();
builder.buildScreen();
builder.buildCamera();
return builder.assemblePhone();
}
}
代码很简单,用了多态,可传入不同的建造工具,在建造工具建完后,返回产品手机。期间,它并不需要知道是哪个建造工具,因为每一个建造工具类都是实现了造手机这个功能。
最后就是我们的调用者,也就是传说中的main 函数:
5.Main 函数
public class Main {
public static void main(String[] args) {
BuilderMan.buildPhone(new MeiBlue2Builder()).showInfo();
BuilderMan.buildPhone(new Iphone6sBuilder()).showInfo();
}
}
如下是代码运行的结果:
电池容量:2500mAh | 屏幕尺寸:5 英寸 | 相机像素:1300万像素
电池容量:1715mAh | 屏幕尺寸:4.7英寸 | 相机像素:1200万像素
—————————————————我是分割线————————————————————————————
综上所述,我们可以知道文章开头,我写的那句通俗易懂 : 调用者叫建造者用不同的建造工具造出不同产品。
好,国际惯例,我们总结一把:
建造者模式,为了创建不同的对象而不更改调用者的代码,抽象出建造工具接口,写多个建造工具类来创建不同的产品。代码多了,但条理清晰。好吧,我编不下去了,为什么打高大上的汉字就这么难呢?哦,I know ,I konw .because 我们是程序员。
再后面就多了,存在即合理。
——————————————————————————————————
5.使用建造者模式的好处:
1.使用建造者模式可以使客户端不必知道产品内部组成的细节。
2.具体的建造者类之间是相互独立的,对系统的扩展非常有利。
3.由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。
6.使用建造者模式的场合:
——————————————————————————————————