构建者模式,顾名思义就是类似造房子,有一个固定的流程。将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为构建者模式。
在构建者模式中存在着以下4个角色
1、builder :为创建一个产品对象的各个部件指定抽象接口
2、ConcreteBuilder: 实现Builder的接口以构造和装配产品的各个部件,是构建者的实现类,承担具体的构建任务
3、Director(Designer)设计者, 构造一个使用Builder接口的对象,负责构建的过程,首先做什么,然后做什么,设计者负责来设计,但是具体的实现,他是不做的,需要交给实际构建者来承担
4、Product表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并且定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
这里以构建一座房屋为例进行说明:比如,我需要造一座房子,但是我不知道怎么盖,也不知道怎么设计,于是我要找一帮建筑工人,他们会砌墙。还需要找一个设计师,他知道怎么设计,我还要确保工人挺设计师的领导。而设计师本身是不干活的,光是下达命令,这里砌一堵墙,那里造一扇窗。这样工人开始建设,最后我从工人那里收房。
首先定义建造房子的构建方法:
public interface Builder {
void makeWindow();
void makeFloor();
Room getRoom();
}
房子model
@Data
public class Room {
private String window;
private String floor;
}
定义设计师。它的职责是指挥工人按照自己的设计图纸建造房子
/**
* 设计师,专门用来设计房屋,它用以控制制造房屋的整个过程以及流程!
*/
public class Designer {
public void order(Builder builder){
// 1、先建造窗户
builder.makeWindow();
// 2、 再建造地板
builder.makeFloor();
}
}
工人、负责工程的具体施工
/**
* 工人,负责进行详细部件如窗户,地板的建造
* 同一时候由于房子是工人建设的,因此建设完毕后由他把房子递交回去交给房主
*/
public class Worker implements Builder{
private String window = "";
private String floor = "";
Room room = new Room();
@Override
public void makeWindow() {
System.out.println("经过一系列复杂操作生产窗户!");
window = new String("创建好了window!");
room.setWindow(window);
}
@Override
public void makeFloor() {
System.out.println("经过一系列复杂操作生产天花板等!");
floor = new String("创建好了floor!");
room.setFloor(floor);
}
@Override
public Room getRoom() {
if(!window.equals("") && !floor.equals("")){
System.out.println("房子已经全部修建好!");
return room;
}else {
return null;
}
}
}
最后就是房主可以收房了
public static void main(String[] args) {
Builder worker = new Worker();
Designer d = new Designer();
d.order(worker);
Room room = worker.getRoom();
System.out.println("最终建造的房子是:"+room);
}
result:
经过一系列复杂操作生产普通窗户!
经过一系列复杂操作生产普通天花板等!
房子已经全部修建好!
最终建造的房子是:Room(window=创建好了普通-window!, floor=创建好了普通-floor!)
如果后面有新的需求,比如房主觉得这个房子又需要修建一个更加高级的房子,其实还是可以按照以前设计师的设计图纸进行建造的,只是需要一批高级的建筑工人。而建造房子的工序是没有改变的,因此我们只需要再重新实现以下Builder构建者类就能轻易完成整个建造过程(新的需求)。
一批高级工人来建造房子,新实现Builder建造者类
/**
* 高级工人盖的房子
*/
public class SeniorWorker implements Builder{
private String window = "";
private String floor = "";
@Override
public void makeWindow() {
System.out.println("生产高级窗户!");
window = new String("创建好了高级的senior-window!");
}
@Override
public void makeFloor() {
System.out.println("生产高级天花板!");
floor = new String("创建好了高级的senior-floor!");
}
@Override
public Room getRoom() {
if(!window.equals("") && !floor.equals("")){
System.out.println("高级民工-senior房子已经全部修建好!");
return new Room();
}else {
return null;
}
}
}
最后交房的时候让这批高级工人来完成就OK了,
public static void main(String[] args) {
Builder worker = new SeniorWorker();
Designer d = new Designer();
d.order(worker);
Room room = worker.getRoom();
System.out.println("最终建造的房子是:"+room);
}
result:
生产高级窗户!
生产高级天花板!
高级民工-senior房子已经全部修建好!
最终建造的房子是:Room(window=创建好了高级的senior-window!, floor=创建好了高级的senior-floor!)
发现只需要稍加改造就能达到我们建造高级房子的目的。