当一个类的构造函数参数个数超过4个,而且这些参数有些是可选的参数,考虑使用构造者模式。
该模式的主要优点如下:
1.封装性好,构建和表示分离。
2.扩展性好,各个具体的建造者相互独立,有利于系统的解耦。
3.客户端不必知道产品内部组成的细节,建造者可以对创建过程逐步细化,而不对其它模块产生任何影响,便于控制细节风险。
缺点如下:
1.产品的组成部分必须相同,这限制了其使用范围。
2.如果产品的内部变化复杂,如果产品内部发生变化,则建造者也要同步修改,维护成本较大。
以常见computer代码演示如下:
第一步:构造目标类
package com.company.src.BuildTest;
public class Computer {
private String cpu;
private String ram;
private int usbCount;
private String keyBoard;
private String display;
public Computer(String cpu, String ram) {
this.cpu = cpu;
this.ram = ram;
}
public void setUsbCount(int usbCount) {
this.usbCount = usbCount;
}
public void setKeyBoard(String keyBoard) {
this.keyBoard = keyBoard;
}
public void setDisplay(String display) {
this.display = display;
}
public int getUsbCount() {
return usbCount;
}
public String getKeyBoard() {
return keyBoard;
}
public String getDisplay() {
return display;
}
public String show() {
return "Computer{" +
"cpu='" + cpu + '\'' +
", ram='" + ram + '\'' +
", usbCount=" + usbCount +
", keyboard='" + keyBoard + '\'' +
", display='" + display + '\'' +
'}';
}
}
第二步:抽象构建者类
package com.company.src.BuildTest;
public abstract class ComputerBuilder {
public abstract void setUsbCount();
public abstract void setKeyBoard();
public abstract void setDisplay();
public abstract Computer getComputer();
}
第三步:建造实体建造者类
苹果电脑构建者类:
package com.company.src.BuildTest;
public class AppleComputerBuilder extends ComputerBuilder {
private Computer computer;
public AppleComputerBuilder(String cpu ,String ram) {
this.computer = new Computer(cpu, ram);
}
@Override
public void setUsbCount() {
computer.setUsbCount(3);
}
@Override
public void setKeyBoard() {
computer.setKeyBoard("Apple 键盘");
}
@Override
public void setDisplay() {
computer.setDisplay("Apple 显示器");
}
@Override
public Computer getComputer() {
return computer;
}
}
戴尔电脑构建者类
package com.company.src.BuildTest;
public class DellComputerBuilder extends ComputerBuilder {
private Computer computer;
public DellComputerBuilder(String cpu ,String ram) {
this.computer = new Computer(cpu, ram);
}
@Override
public void setUsbCount() {
computer.setUsbCount(5);
}
@Override
public void setKeyBoard() {
computer.setKeyBoard("Dell 键盘");
}
@Override
public void setDisplay() {
computer.setDisplay("Dell 显示器");
}
@Override
public Computer getComputer() {
return computer;
}
}
第四步:指导者类
package com.company.src.BuildTest;
public class ComputerDirector {
public void makeComputer(ComputerBuilder builder){
builder.setUsbCount();
builder.setKeyBoard();
builder.setDisplay();
}
}
代码演示使用示例:
//建造者模式
ComputerDirector director = new ComputerDirector();
ComputerBuilder builder = new AppleComputerBuilder("Apple M14 处理器","ram 三星");
director.makeComputer(builder);
Computer appleComputer = builder.getComputer();
System.out.println(" Apple Computer:" + appleComputer.show());
ComputerDirector windowsDirector = new ComputerDirector();
ComputerBuilder dellBuild = new DellComputerBuilder("Intel i7处理器","ram金士顿");
windowsDirector.makeComputer(dellBuild);
Computer dellComputer = dellBuild.getComputer();
System.out.println("Dell Computer:"+ dellComputer.show());
执行结果: