本篇介绍创建型模式中的建造者模式。
这里想说一下,其实很多设计模式我们平时很少会完全用到,即便是最常用的都是如此,更何况一些不常用的,我们学习这些设计模式更多的是学习其编程的思想(我自己的理解),可别只学其形不学其神。
建造者模式
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 --百度百科
从定义我们暂时可以看出建造者模式可以将复杂对象的创建与表示解耦(设计原则中提到将变化的部分与不变的部分隔离开),使用同样的构建过程可以创建不同的表示可能是通过继承实现的。
例如我们要自己组装一台台式机,CPU,显卡,显示器,风扇和硬盘都是我们需要考虑的因素,在我们并不了解这些配置的时候我们就可以去跟电脑城的老板说清楚我们的诉求,老板转达给师傅我们的诉求并让师傅帮我们选好合适的配置并安装。电脑,我们,电脑城老板,师傅在建造者模式中扮演的角色看类图来了解。
类图
具体实现
台式电脑:
class DesktopComputer {
private String CPU;
private String GPU;
private String display;
private String fan;
private String hardDisk;
public String getCPU() {
return CPU;
}
public void setCPU(String CPU) {
this.CPU = CPU;
}
public String getGPU() {
return GPU;
}
public void setGPU(String GPU) {
this.GPU = GPU;
}
public String getDisplay() {
return display;
}
public void setDisplay(String display) {
this.display = display;
}
public String getFan() {
return fan;
}
public void setFan(String fan) {
this.fan = fan;
}
public String getHardDisk() {
return hardDisk;
}
public void setHardDisk(String hardDisk) {
this.hardDisk = hardDisk;
}
@Override
public String toString() {
return "DesktopComputer{" +
"CPU='" + CPU + '\'' +
", GPU='" + GPU + '\'' +
", display='" + display + '\'' +
", fan='" + fan + '\'' +
", hardDisk='" + hardDisk + '\'' +
'}';
}
}
抽象建造者:
abstract class AbstractMaster {
protected DesktopComputer desktopComputer = new DesktopComputer();
public abstract void buildCPU();
public abstract void buildGPU();
public abstract void buildDisplay();
public abstract void buildFan();
public abstract void buildHardDisk();
public DesktopComputer getDesktopComputer(){
return desktopComputer;
}
}
具体建造者:
class SeniorMaster extends AbstractMaster{
@Override
public void buildCPU() {
desktopComputer.setCPU("i9-9900KS");
}
@Override
public void buildGPU() {
desktopComputer.setGPU("2080Ti");
}
@Override
public void buildDisplay() {
desktopComputer.setDisplay("4K");
}
@Override
public void buildFan() {
desktopComputer.setFan("水冷");
}
@Override
public void buildHardDisk() {
desktopComputer.setHardDisk("固态");
}
}
电脑城老板:
class Boss {
public DesktopComputer buildDesktopComputer(AbstractMaster master) {
master.buildCPU();
master.buildDisplay();
master.buildFan();
master.buildGPU();
master.buildHardDisk();
return master.getDesktopComputer();
}
}
测试程序以及输出结果:
//测试程序
public static void main(String[] args) {
AbstractMaster master = new SeniorMaster();
Boss boss = new Boss();
DesktopComputer desktopComputer = boss.buildDesktopComputer(master);
System.out.println(desktopComputer);
}
//输出结果
DesktopComputer{CPU='i9-9900KS', GPU='2080Ti', display='4K', fan='水冷', hardDisk='固态'}
台式机算是一个比较复杂的对象了,但使用了建造者模式后,客户端只需要调用指挥者类就可以创建符合要求的产品,例如顾客并不知道吃鸡需要的配置,只要老板知道就可以了(解耦);另一个顾客再要求其他配置的电脑我们只需要再添加一个具体建造者类(易于扩展)。
但产品内部过于复杂时,例如台式电脑,就可能会有多个建造者类(CPU,GPU,显卡,风扇和硬盘的不同组合),代码过于冗余。