什么是建造者模式
建造者模式(Builder Pattern) 又名生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。
建造者模式所完成的内容就是通过将多个简单对象通过一步步的组装构建出一个复杂对象的过程。
案例
有一个电脑店,要组合多种不同的硬件来控制价格。例如:3080显卡、1060显卡、16G内存条、8G内存条...
具体实现
产品对象
public class Menu {
//cpu
private String cpu;
//显卡
private String gpu;
//内存条
private String memoryBank;
//硬盘
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 getMemoryBank() {
return memoryBank;
}
public void setMemoryBank(String memoryBank) {
this.memoryBank = memoryBank;
}
public String getHardDisk() {
return hardDisk;
}
public void setHardDisk(String hardDisk) {
this.hardDisk = hardDisk;
}
}
抽象构建者
public abstract class MenuBuilder {
Menu menu = new Menu();
public abstract void buildCpu();
public abstract void buildGpu();
public abstract void buildMemoryBank();
public abstract void buildHardDisk();
public Menu getMenu(){
return menu;
}
}
具体构造者
public class MenuA extends MenuBuilder{
@Override
public void buildCpu() {
menu.setCpu("i7");
}
@Override
public void buildGpu() {
menu.setGpu("3080");
}
@Override
public void buildMemoryBank() {
menu.setMemoryBank("32G");
}
@Override
public void buildHardDisk() {
menu.setHardDisk("1TB");
}
}
public class MenuB extends MenuBuilder{
@Override
public void buildCpu() {
menu.setCpu("i5");
}
@Override
public void buildGpu() {
menu.setGpu("3060");
}
@Override
public void buildMemoryBank() {
menu.setMemoryBank("16G");
}
@Override
public void buildHardDisk() {
menu.setHardDisk("512GB");
}
}
指挥者
public class Commander {
private MenuBuilder menuBuilder;
public Commander(MenuBuilder menuBuilder) {
this.menuBuilder = menuBuilder;
}
public Menu construct(){
menuBuilder.buildCpu();
menuBuilder.buildGpu();
menuBuilder.buildHardDisk();
menuBuilder.buildMemoryBank();
return menuBuilder.getMenu();
}
}
使用
public class Demo {
public static void main(String[] args) {
MenuA menuA = new MenuA();
Commander commander = new Commander(menuA);
Menu construct = commander.construct();
System.out.println(construct.toString());
}
}
总结
此设计模式满足了单一职责原则以及可复用的技术、建造者独立、易扩展、便于控制细节风险。但同时当出现特别多的套餐以及很多的组合后,类的不断扩展也会造成难以维护的问题。但这种设计结构模型可以把重复的内容抽象到数据库中,按照需要配置。这样就可以减少代码中大量的重复。