前言
在生活中,有这么一种场景,当需要去4S店买车时,会根据个人的预算,卖家会给你推荐同一个品牌的相应的低配,中配或高配版,在网上购买毕笔记本时也会遇到类似的情况,但不管是汽车也好,还是电脑,它们基本的功能都是具备的,但是内部使用的材料不同造成最终搭配出来的效果不一样,映射到设计模式上,就是一个典型的建造者设计模式
建造者设计模式
- 使用多个简单的对象一步步构建成一个复杂的对象,即将一个复杂对象的构建与表示进行分离,使得同样的构建过程存在多种表示(即电脑可以有多条组装线,A线组装低配电脑,B线组装高配电脑)
- 允许用户只需要指定复杂对象的类型和内容就可以构建它们,不需要知道构建内容的具体细节(比如上述以购买笔记本电脑为例,用户只需选择自己的配置类型是低或中或高配类型即可)
建造者模式核心组成结构
- Builder:抽象建造者,统一定义多个通用方法和构建产品的方法
- ConcreteBuilder:具体建造者,可以有多个
- Director:总指挥,控制整个产品的组装过程,将需求交给建造者,由建造者创建对象
- Product:产品角色
下面用一张简单的图表示该模式下各个角色的位置
代码演示
本文以组装笔记本电脑为例说明
1、具体的产品,Computer
@Data
@Setter
@Getter
@ToString
public class Computer {
private String cpu;
private String memory;
private String mainboard;
private String disk;
private String power;
}
2、Builder,定义构建产品的通用方法
public interface Builder {
void buildCpu();
void buildMainBoard();
void buildDisk();
void buildPower();
void buildMemory();
Computer createComputer();
}
3、具体的产品构建者,创建两个类,分别创建低配版电脑和高配版电脑
低配版电脑
public class LowLevelBuilder implements Builder{
private Computer computer = new Computer();
@Override
public void buildCpu() {
computer.setCpu("低配版 CPU");
}
@Override
public void buildMainBoard() {
computer.setMainboard("低配版 主板");
}
@Override
public void buildDisk() {
computer.setDisk("低配版 硬盘");
}
@Override
public void buildPower() {
computer.setPower("低配版 电源");
}
@Override
public void buildMemory() {
computer.setMemory("低配版 内存");
}
@Override
public Computer createComputer() {
return computer;
}
}
高配版电脑
public class HighLevelBuilder implements Builder{
private Computer computer = new Computer();
@Override
public void buildCpu() {
computer.setCpu("高配版 CPU");
}
@Override
public void buildMainBoard() {
computer.setMainboard("高配版 主板");
}
@Override
public void buildDisk() {
computer.setDisk("高配版 硬盘");
}
@Override
public void buildPower() {
computer.setPower("高配版 电源");
}
@Override
public void buildMemory() {
computer.setMemory("高配版 内存");
}
@Override
public Computer createComputer() {
return computer;
}
}
4、总指挥,负责根据用户需求,创建指定类型(低配或高配)的电脑
public class ComputerDirector {
public Computer createComputer(Builder builder){
builder.buildCpu();
builder.buildMainBoard();
builder.buildDisk();
builder.buildPower();
builder.buildMemory();
return builder.createComputer();
}
}
说明:
总指挥的角色,可以将产品和创建的过程进行解耦,使用相同的创建过程就可以创建不同的产品,控制产品的生产过程,即只负责组装,相当于是简单调用接口中的组装方法,具体的实现细节由各个builder去操作
测试:
public class Test {
public static void main(String[] args) {
ComputerDirector director = new ComputerDirector();
Computer computer1 = director.createComputer(new HighLevelBuilder());
System.out.println(computer1.toString());
System.out.println();
Computer computer2 = director.createComputer(new LowLevelBuilder());
System.out.println(computer2.toString());
}
}
通过这种方式就可以达到根据需求产生同一类产品不同规格的需求
建造者设计模式优点:
- 客户端不必知道产品内部的组成细节,从而将产品的本身与产品的创建过程进行分离
- 逻辑结构比较清晰简单,开发者的学习和理解都较为容易
- 每个具体的创建者都相对独立,之间互不影响,从而方便各个建造者更好的关注自己的产品创建过程
- 新增的具体建造者无需修改原有的代码,符合开闭原则
- 建造者设计模式如果结合链式编程来使用,可以使代码更优雅
缺点:
- 使用建造者模式创建的产品一般来说具有较多的共同的特点,如果产品的差异较大使用起来并不是很好
- 每新增一种规则的产品,需要添加新的建造者,一定程度上会让代码越来越臃肿