一、什么是建造者模式?
当一个对象的创建包含该对象的部件部分及部件的装配过程时,建造者模式可以将对象的部件生成过程及装配过程进行分离解耦,从而使系统结构变得更加清晰。举个栗子:我们知道电脑是由CPU,硬盘和内存组成的,那么如果我们要创建一个电脑,首先的思路就是我们去制造CPU、硬盘和内存,然后进行组装,这样就生成了一台电脑。仔细一想,这个模式存在很多问题,它将部件的生成和组装放在了一起,那么如果我现在要一台Dell电脑(Dell记得给广告费XD),那我需要制造Dell电脑的各种部件,然后组装。如果需要苹果的电脑,那么需要制造苹果的部件然后组装。这种模式一来使部件和组装的依赖太强,二来组装这个过程其实是可以拎出来独立,从而减少重复代码量的。
运用建造者模式就可以比较好地解决上述问题,建造者模式可以将复杂对象的构建过程和它的部件进行解耦。使用建造者模式,我们可以用Builder类负责部件的创建,Producer类负责产品的组装。具体见下文
二、建造者模式框图
我们通过买电脑这个例子来讲述下建造者模式在其中的应用。
我们可以看到这里的建造者模式中有以下几个角色:
1. 部件类:电脑部件的具体类,如CPU、硬盘及内存,这些类在创建的时候需要向构造方法中传入String类的model,即指定型号。
2. 具体的商品类:这里是Dell的电脑,表示Dell电脑是由哪些部件组成的,内部包含了部件类的引用。
3. 抽象的建造者:具体建造者的基类,其中规定了几个要被重写的接口方法。在本例中表示抽象的电脑制造商,负责生产各种电脑配件:CPU, RAM, Disk等
4. 具体的建造者:实现了抽象建造者接口。在本例中,表示Dell电脑的部件制造商。
5. 客户端:买电脑的人,指定了需要什么牌子的电脑。
三、建造者模式的具体代码
3.1 部件类,包含CPU、Disk、RAM
public class CPU {
private String model;
public CPU(String model){
this.model = model;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
}
public class Disk {
private String model;
public Disk(String model){
this.model = model;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
}
public class RAM {
private String model;
public RAM(String model){
this.model = model;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
}
3.2 DellComputer类,具体电脑类
package designpatterns.builder;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Olive on 2017/12/14.
* 电脑
*/
public class DellComputer {
private CPU cpu;
private Disk disk;
private List<RAM> RAMList;
public void generateCPU(CPU cpu) {
this.cpu = cpu;
}
public void generateDisk(Disk disk) {
this.disk = disk;
}
public void generateRAM(RAM RAM) {
if (RAMList == null) {
RAMList = new ArrayList<RAM>();
}
RAMList.add(RAM);
}
public void printConfiguration() {
if (cpu == null || disk == null || RAMList == null) {
System.out.println("Wait a moment!");
} else {
System.out.println("This is a Dell computer with " + cpu.getModel()
+ ", " + disk.getModel() + " and " + RAMList.size() + " RAM");
}
}
}
3.3 ComputerBuilder类,抽象的电脑建造者类
package designpatterns.builder;
/**
* Created by Olive on 2017/12/14.
* 电脑制造商,负责生产各种电脑配件:CPU,RAM,Disk等
*/
public interface ComputerBuilder {
void buildCPU();
void buildDisk();
void buildRAM();
}
3.4 DellComputerBuilder类,具体的电脑部件建造者类
package designpatterns.builder;
/**
* Created by Olive on 2017/12/14.
* Dell电脑制造商,负责制造电脑各配件
*
*/
public class DellComputerBuilder implements ComputerBuilder{
private DellComputer dellComputer;
public DellComputerBuilder(){
dellComputer = new DellComputer();
}
public void buildCPU() {
dellComputer.generateCPU(new CPU("Dell CPU"));
}
public void buildDisk() {
dellComputer.generateDisk(new Disk("Dell Disk"));
}
public void buildRAM() {
dellComputer.generateRAM(new RAM("Dell RAM1"));
dellComputer.generateRAM(new RAM("Dell RAM2"));
}
// 生成Dell电脑配件
public DellComputer getDellComputer(){
//System.out.println("Now you get a dell dellComputer~");
return dellComputer;
}
}
3.5 Producer类,电脑经销商
package designpatterns.builder;
/**
* Created by Olive on 2017/12/14.
* 电脑经销商
*/
public class Producer {
private ComputerBuilder builder;
public Producer(ComputerBuilder builder){
this.builder = builder;
}
// 经销商负责将电脑配件组装成电脑
public void construct(){
builder.buildCPU();
builder.buildDisk();
builder.buildRAM();
}
}
3.6 Client类,客户端
package designpatterns.builder;
/**
* Created by Olive on 2017/12/14.
*/
public class Client {
public static void main(String[] args){
// 让Dell电脑的制造商去制造各种配件
DellComputerBuilder builder = new DellComputerBuilder();
// 经销商完成组装工作
Producer producer = new Producer(builder);
producer.construct();
// 最后就获得了一台Dell电脑
DellComputer dellComputer = builder.getDellComputer();
dellComputer.printConfiguration();
}
}
3.7 结果
This is a Dell computer with Dell CPU, Dell Disk and 2 RAM
Process finished with exit code 0
四、一点小总结
使用建造者模式是很方便的,上面的例子中我们买了一台Dell的电脑,如果我们想要Mac,那么我们就告诉电脑经销商我们需要Mac电脑及其配件即可,反映到代码层面我们需要重写一个MacComputer和MacComputerBuilder类即可。建造者模式和工厂模式有一定的相像,比较容易搞混。但是这两个模式在设计理念中有很大的不同,工厂模式在于解决产品的系列化生成,这些产品都是整体创建的;建造者更关注于复杂产品的细节创建,比如完成复杂产品的部件构建和最后的组装。