建造者模式也是我要分享的最后一种创建型模式,创建型模式还有单例模式、原型模式、工厂方法模式、抽象工厂模式,这些模式都在前面分享过了,有兴趣的同学可以往前面翻翻。
好了,下面进入正题。
建造者模式既然属于创建型模式,那么他就也是用来创建对象的,并且它是用来创建相对复杂点的对象,该类对象可以拆分成很多个部分。比如,一台主机是由CPU、主板、内存、硬盘、显卡、机箱等等组成,每个部位你都可以选取你想要的配置,最终组成你所需求的主机。
建造者模式有四个主要角色:
(1)产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个组成部件。
(2)抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法getResult()。
(3)具体建造者(Concrete Builder):实现Builder接口,完成复杂产品的各个部件的具体创建方法。
(4)指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。
四个角色的关系图:

下面上代码来分别诠释这几个主角。
1.产品角色
在这个例子中,产品角色就是电脑了。
package builder;
import lombok.Data;
import lombok.ToString;
@Data
@ToString
public class Computer {
/**
* cpu
*/
private String cpu;
/**
* 内存
*/
private String ram;
/**
* 显卡
*/
private String gpu;
/**
* 硬盘
*/
private String disk;
}
2.抽象建造者
package builder;
public abstract class AbstractComputerBuilder {
public Computer computer = new Computer();
abstract void builderCPU();
abstract void builderRam();
abstract void builderGPU();
abstract void builderDisk();
public Computer getComputer() {
return computer;
}
}
3.具体建造者
这里我暂且先定义俩种
package builder;
/**
* 华为电脑建造器
*/
public class HWComputerBuilder extends AbstractComputerBuilder{
@Override
void builderCPU() {
super.computer.setCpu("华为CPU");
}
@Override
void builderRam() {
super.computer.setRam("华为Ram");
}
@Override
void builderGPU() {
super.computer.setGpu("华为GPU");
}
@Override
void builderDisk() {
super.computer.setDisk("华为硬盘");
}
@Override
public Computer getComputer() {
return super.getComputer();
}
}
package builder;
/**
* 小米电脑建造器
*/
public class MiComputerBuilder extends AbstractComputerBuilder{
@Override
void builderCPU() {
super.computer.setCpu("小米CPU");
}
@Override
void builderRam() {
super.computer.setRam("小米Ram");
}
@Override
void builderGPU() {
super.computer.setGpu("小米GPU");
}
@Override
void builderDisk() {
super.computer.setDisk("小米硬盘");
}
@Override
public Computer getComputer() {
return super.getComputer();
}
}
4.指挥者
package builder;
import lombok.AllArgsConstructor;
@AllArgsConstructor
public class ComputerManager {
private AbstractComputerBuilder computerBuilder;
/**
* 组装电脑
* @return 电脑
*/
public Computer builderComputer(){
computerBuilder.builderCPU();
computerBuilder.builderRam();
computerBuilder.builderGPU();
computerBuilder.builderDisk();
return this.computerBuilder.getComputer();
}
}
写个用例测试下:
package builder;
public class start {
public static void main(String[] args) {
//构造小米电脑
MiComputerBuilder miComputerBuilder = new MiComputerBuilder();
ComputerManager computerManager = new ComputerManager(miComputerBuilder);
System.out.println(computerManager.builderComputer().toString());
//构造华为电脑
HWComputerBuilder hwComputerBuilder = new HWComputerBuilder();
ComputerManager computerManager1 = new ComputerManager(hwComputerBuilder);
System.out.println(computerManager1.builderComputer().toString());
}
}
运行结果如下:
通过上面代码,我们可以看出建造一个产品,我们不需要知道产品是怎么组装的,我们只需要整个合适的模板,交给组装的人就能得到我们想要的产品。
JAVA源码中有典型的建造者模式使用者,java.lang.StringBuilder/java.lang.StringBuffer,看下StringBuilder结构
感兴趣的同学可以去看看源码。
分享是种乐趣~~~修BUG也是