interface IBuilder { public void buildCPU(); public void buildScreen(); public void buildBattery(); public Phone getPhone(); } public class Builder { public static void main(String[] args) { Designer ds = new Designer(); IBuilder appleBuilder = new AppleBuilder(); ds.buildPhone(appleBuilder); Phone apple = appleBuilder.getPhone(); System.out.println(apple); IBuilder samsungBuilder = new SamsungBuilder(); ds.buildPhone(samsungBuilder); Phone samsung = samsungBuilder.getPhone(); System.out.println(samsung); } } class Designer { public void buildPhone(IBuilder builder) { System.out.println("begin build phone "); builder.buildCPU(); builder.buildBattery(); builder.buildScreen(); System.out.println("end build phone..."); } } class AppleBuilder implements IBuilder { private Phone phone = new Apple(); public void buildCPU() { System.out.println("build CPU: Qualcomm"); phone.add("CPU: Qualcomm"); } public void buildScreen() { System.out.println("build SCREEN: JDI"); phone.add("SCREEN: JDI"); } public void buildBattery() { System.out.println("build BATTERY: DeSai"); phone.add("BATTERY: DeSai"); } public Phone getPhone() { return this.phone; } } class SamsungBuilder implements IBuilder { private Phone phone = new Samsung(); public void buildCPU() { System.out.println("build CPU: MTK"); phone.add("CPU: MTK"); } public void buildScreen() { System.out.println("build SCREEN: Samsung"); phone.add("SCREEN: Samsung"); } public void buildBattery() { System.out.println("build BATTERY: DeSai"); phone.add("BATTERY: DeSai"); } public Phone getPhone() { return this.phone; } } abstract class Phone { protected List<String> parts = new ArrayList<String>(); public void add(String part) { this.parts.add(part); } public abstract String getBrand(); @Override public String toString() { StringBuilder result = new StringBuilder(); result.append(this.getBrand()).append("手机信息:"); for (String part : parts) result.append(part).append(" "); return result.toString(); } } class Apple extends Phone { @Override public String getBrand() { return "Apple"; } } class Samsung extends Phone { @Override public String getBrand() { return "Samsung"; } }
* 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
* 复杂对象的创建
* 构造器和静态工厂方法中参数过多是使用Builder
输出为:
begin build phone
build CPU: Qualcomm
build BATTERY: DeSai
build SCREEN: JDI
end build phone...
Apple手机信息:CPU: Qualcomm BATTERY: DeSai SCREEN: JDI
begin build phone
build CPU: MTK
build BATTERY: DeSai
build SCREEN: Samsung
end build phone...
Samsung手机信息:CPU: MTK BATTERY: DeSai SCREEN: Samsung