建造者模式是创建型模式之一,分离了对象子组件的单独构造(也就是我们常见到的以builder结尾的,如:我们所熟悉的关于SAX解析的SAXBuilder)和装配(也就是我们经常见到的以director结尾的,如:DefaulRequestDirector)。由于实现了构建和装配的解耦,不同的构建器,相同的装配,也能创建出不同的对象。即使是相同的构建器,如果装配的顺序不同,也可以创建出不同的对象。也就是实现了构建算法,装配算法的解耦,实现了更好的复用。就像我们的手机一样,我们的手机是有很多零件组合而成的,但是这些零件是有不同的工厂生产,然后再运送到一起,有工人和机器共同配合装配而成的。到我们手里的手机虽是完整的,但是它也离不了建造者和装配者。下面我们就以手机的生产为例:
生产手机电池
public class Battery {
String name;
public Battery(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
生产手机屏幕
public class Screen {
String name;
public Screen(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
生产手机内存
public class Memory {
String name;
public Memory(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
待生产的手机
public class Phone {
private Battery battery;
private Screen screen;
private Memory memory;
public Battery getBattery() {
return battery;
}
public void setBattery(Battery battery) {
this.battery = battery;
}
public Screen getScreen() {
return screen;
}
public void setScreen(Screen screen) {
this.screen = screen;
}
public Memory getMemory() {
return memory;
}
public void setMemory(Memory memory) {
this.memory = memory;
}
}
手机的构建者
public interface PhoneBuilder {
Battery batteryBuilder();
Screen screenBuilder();
Memory memoryBuilder();
}
准备生产的是迷你手机
public class MiniPhoneBuilder implements PhoneBuilder {
@Override
public Battery batteryBuilder() {
return new Battery("我生产的是手机电池");
}
@Override
public Screen screenBuilder() {
return new Screen("我生产的是手机屏幕");
}
@Override
public Memory memoryBuilder() {
return new Memory("我生产的是手机内存");
}
}
手机的装配者
public interface PhoneDirector {
Phone phoneDirector();
}
迷你手机的装配者
public class MiniPhoneDirector implements PhoneDirector {
private PhoneBuilder phoneBuilder;
public MiniPhoneDirector(PhoneBuilder phoneBuilder) {
this.phoneBuilder = phoneBuilder;
}
@Override
public Phone phoneDirector() {
Battery battery = phoneBuilder.batteryBuilder();
Screen screen = phoneBuilder.screenBuilder();
Memory memory = phoneBuilder.memoryBuilder();
Phone phone = new Phone();
phone.setBattery(battery);
phone.setScreen(screen);
phone.setMemory(memory);
return phone;
}
}