建造者模式是创建性模式的一种,主要使用场景是创建一些相似且复杂的对象。比如各种型号的手机,都是由cpu,内存,屏幕,主板等部分构成的,各个组成部分相似,但每个部分又是比较复杂的。
为了组装一台任意型号的手机,采用建造者模式是不错的,用户无需关注你是怎么构建手机的,只要拓展一个该型号手机的建造器,并由手机组装的统一指挥员指挥即可。看一下类图:
由类图可以看出,Builder接口定义了需要构造哪些东西,产品生产是靠具体的构造器(ConcreteBuilder)的,指挥类(Director)可以对多个builder进行指挥。当需要新增一种产品的时候,只要新增一个具体的构造器(ConcreteBuilder)就可以了。
手机组装的代码实例:
定义手机类:
//定义一个手机类,假设手机由cpu和memory组成
public class Phone {
private String cpu;
private String memory;
//getter & setter & toString
}
定义构造器接口,每个实例构造器都要实现该类
public interface PhoneBuilder {
/**
* 建造者模式适用于复杂对象的创建和使用,且差异性较小,或很多参数有默认值,这样也可以用抽象类代替接口
*/
void buildCpu();
void buildMemory();
Phone getPhone();
}
定义一个指挥类,对上面的PhoneBuilder接口中的方法进行指挥
public class PhoneDirector {
//这里比较简单,指挥类还可以同时指挥其他builder
private PhoneBuilder phoneBuilder;
public PhoneDirector() {
}
public PhoneDirector(PhoneBuilder phoneBuilder) {
this.phoneBuilder = phoneBuilder;
}
//同样的构建过程
public void construct() {
phoneBuilder.buildCpu();
phoneBuilder.buildMemory();
}
public void showPhone() {
System.out.println(phoneBuilder.getPhone());
}
}
最后就是对接口中的建造细节进行实现了,定义了华为和小米手机:
public class HuaWeiBuilder implements PhoneBuilder {
private Phone phone = new Phone();
@Override
public void buildCpu() {
//封装复杂的构建过程
phone.setCpu("HuaWeiCpu");
}
@Override
public void buildMemory() {
//封装复杂的构建过程
phone.setMemory("HuaWeiMemory");
}
public Phone getPhone() {
return phone;
}
}
public class XiaoMiBuilder implements PhoneBuilder {
private Phone phone = new Phone();
@Override
public void buildCpu() {
phone.setCpu("XiaoMiCpu");
}
@Override
public void buildMemory() {
phone.setMemory("XiaomiMemory");
}
public Phone getPhone() {
return phone;
}
}
使用的时候只要将具体的构造器交给指挥员指挥就行了
public class Main {
public static void main(String[] args) {
//将具体的建造器交给指挥员指挥
PhoneDirector huaWeiPhoneDirector = new PhoneDirector(new HuaWeiBuilder());
huaWeiPhoneDirector.construct();
huaWeiPhoneDirector.showPhone();
PhoneDirector XiaoMiPhoneDirector = new PhoneDirector(new XiaoMiBuilder());
XiaoMiPhoneDirector.construct();
XiaoMiPhoneDirector.showPhone();
}
}
好,新鲜的华为和小米出炉了!