一.什么是建造者模式
将一个复杂的对象的创建与它的表示分离,使得同样的创建过程有不同的表示。
二.建造者模式怎么写
一般的建造者模式,我们通过造房子的UML类图来理解一下
这里有四个角色,设计师,抽象建造者,具体建造者,还有所需要建造的对象。
下面看看具体的代码
设计师:
/**
* 设计师 和建造者是聚合关系(Aggregation)表示has-a的关系,是一种不稳定的包含关系 想象一下员工和老板的关系
* @author Seven
*
*/
public class Designer {
public House constructHouse(Builder builder) {
builder.builderWindow();
builder.builderFloor();
return builder.genHouse();
}
}
抽象构造者
/**
* 抽象建造者 工人
*
* @author Seven
*
*/
public abstract class Builder {
public abstract void builderWindow();
public abstract void builderFloor();
public abstract House genHouse();
}
具体构造者
public class WorkerBuilder extends Builder {
private House house = new House();
@Override
public void builderWindow() {
house.setWindow("欧式窗户");
}
@Override
public void builderFloor() {
house.setFloor("法式地板");
}
@Override
public House genHouse() {
return house;
}
}
房子:
/**
* 需要造的房子
*
* @author Seven
*
*/
public class House {
private String window;
private String floor;
public String getWindow() {
return window;
}
public void setWindow(String window) {
this.window = window;
}
public String getFloor() {
return floor;
}
public void setFloor(String floor) {
this.floor = floor;
}
@Override
public String toString() {
return "House [window=" + window + ", floor=" + floor + "]";
}
}
我们在来看看客户端的调用
public class Client {
public static void main(String[] args) {
Designer designer=new Designer(); //需要设计师
Builder workerBuilder=new WorkerBuilder(); //需要工人
House house=designer.constructHouse(workerBuilder); //建造房子的过程客户端无需知道,只要丢给设计者工人
System.out.println(house.toString());
}
}
我们来看看打印
House [window=欧式窗户, floor=法式地板]
这样就完成了房子的构建,我们并没有直接去new 一个house,而是由设计师去创建的这一切,不需要知道构造的过程。这就是标准的建造者模式。下面来开看建造者模式的变异,我们在上面的设计中,我们发现,通过House对象还是可以通过set方法区修改room的属性的,于是我们移除room的set方法,在WorkBuilder中增加一个内部类House Params,并且包含House 的全部属性,然后在Room类中提供一个包含HouseParams对象的引用,并将里面的参数设置给当前的house对象,我们在WorkBuilder中提供设置HouseParams参数的方法,结果代码就变成了这样:
房子:
public class House {
private String window;
private String floor;
@Override
public String toString() {
return "House [window=" + window + ", floor=" + floor + "]";
}
public House apply(WorkerBuilder.HouseParams houseParams) {
this.window=houseParams.window;
this.floor=houseParams.floor;
return this;
}
}
构造者
public class WorkerBuilder {
private House house=new House();
private HouseParams houseParams=new HouseParams();
public WorkerBuilder builderWindow(String window) {
houseParams.window=window;
return this;
}
public WorkerBuilder builderFloor(String floor) {
houseParams.floor=floor;
return this;
}
public House genHouse() {
return house.apply(houseParams);
}
public class HouseParams{
public String window;
public String floor;
}
}
客户端代码:
public class Client {
public static void main(String[] args) {
WorkerBuilder workerBuilder=new WorkerBuilder().builderFloor("地板").builderWindow("窗户"); //链式调用
House house=workerBuilder.genHouse();
System.out.println(house.toString());;
}
}
打印结果
House [window=欧式窗户, floor=法式地板]
这样也是建造者模式。看起来像不像我们创建Dialog的调用过程。其实翻看源码,设计思想很相似的,这里就不做详细介绍了。
三.总结
本文介绍了什么是建造者模式以建造者模式的常见写法,以及建造者模式的变形写法,记住,建造者模式是用来处理复杂对象的构建的,如果本文对你有用,可以点个赞,如果有不正之处,欢迎留下你的评论,谢谢!