建造者模式:将一个复杂对象的构建与它的表示分离,使得相同的构建过程可以创建不同的表示。
结构图如下:
Builder是为创建一个Product对象的各个部件指定的接口,ConcreteBuilder是具体建造者,实现Builder接口,构造和装配各个部件。Product是具体的产品角色,Director是指挥者,使用Builder接口进行具体的操作。
建造者模式主要用于构建一些复杂的对象,这些对象内部的构建顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。建造者模式的好处就是使得建造代码与表示代码分离,由于建造者隐藏了该产品如何组装的,所以如果需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。
本例通过造手机的情景进行模拟,代码如下:
package chapter13;
public interface PhoneBuilder {
public void buildScreen();
public void buildCpu();
public void buildCamera();
public PhoneProduct getResult();
}
package chapter13;
import java.util.List;
import java.util.ArrayList;
public class PhoneProduct {
private List<String> parts =new ArrayList<>();
public void add(String part) {
this.parts.add(part);
}
public void show() {
for (String part : parts) {
System.out.println(part);
}
}
}
package chapter13;
public class Mi8PhoneBuilder implements PhoneBuilder {
private PhoneProduct pp = new PhoneProduct();
@Override
public void buildScreen() {
this.pp.add("Use a 6.21inch size screen.");
}
@Override
public void buildCpu() {
this.pp.add("Use a SDM845 cpu.");
}
@Override
public void buildCamera() {
this.pp.add("Use a 12 million pixels camera.");
}
@Override
public PhoneProduct getResult() {
return this.pp;
}
}
package chapter13;
public class HWP20PhoneBuilder implements PhoneBuilder {
private PhoneProduct pp = new PhoneProduct();
@Override
public void buildScreen() {
this.pp.add("Use a 5.8inch size screen.");
}
@Override
public void buildCpu() {
this.pp.add("Use a Kirin970 cpu.");
}
@Override
public void buildCamera() {
this.pp.add("Use a 12 million pixels camera.");
}
@Override
public PhoneProduct getResult() {
return this.pp;
}
}
package chapter13;
public class PhoneBuildDirector {
public void construct(PhoneBuilder pb) {
pb.buildScreen();
pb.buildCpu();
pb.buildCamera();
}
}
package chapter13;
public class Terminal {
public static void main(String[] args) {
PhoneBuildDirector director = new PhoneBuildDirector();
PhoneBuilder miBuilder = new Mi8PhoneBuilder();
PhoneBuilder hwBuilder = new HWP20PhoneBuilder();
System.out.println("Build a Mi8 phone:");
director.construct(miBuilder);
PhoneProduct p1 = miBuilder.getResult();
p1.show();
System.out.println("Build a HWP20 phone:");
director.construct(hwBuilder);
PhoneProduct p2 = hwBuilder.getResult();
p2.show();
}
}