子曰:温故而知新,可以为师矣。 《论语》-- 孔子
本篇文章主要学习 建造者
设计模式。它是 创建型
设计模式的一种。
什么是建造者模式???
定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式又被称为生成器模式,它是创建一个复杂对象的创建型模式,将构建复杂对象的过程和它的部件解耦,使得构建过程和部件的表示分离出来。
我们可以举个例子来说明一下:
比如说我们要自己 DIY 一座小民宅,那么我们需要找到建筑公司,建筑公司会找设计师来和我们对接需求,我们只需要把我们的要求告诉设计师,设计师会根据我们的需求画好图纸,当最终的图纸确定好后,会通知工人建造民宅,最终房子建造好了,我们验收房子并付款。 可以看到在此过程中,我们可能会多次更改我们的需求,不管中间建造房子的过程多么复杂,但是最终建造的房子只有一个。
下面我们就实际代码展示一下什么是构造者模式:
1. 创建用户对象
// 用户
public class UserClient {
public static void main(String[] args) {
}
}
我们创建了一个 UserClient
类,也就是用户类,既然要建造房子,我们首先要找到设计师,同时告诉他我们的需求,那么我们就需要定义一个设计师类,同时添加我们所提需求的方法。
2. 创建设计师对象
// 设计师
public class DesignPerson {
// 画图纸
private HouseParam mHouseParam;
// 员工
private Worker mWorker;
public DesignPerson() {
mHouseParam = new HouseParam();
mWorker = new Worker();
}
/**
* 增加楼层
*/
public void addHeight(double height){
mHouseParam.setHeight(height);
}
/**
* 增加面积
*/
public void addWidth(double width){
mHouseParam.setWidth(width);
}
/**
* 增加颜色
*/
public void addColor(String color){
mHouseParam.setColor(color);
}
/**
* 把图纸给工人
* 工人说房子盖好了
* @return
*/
public House build(){
mWorker.setHouseParam(mHouseParam);
return mWorker.buildHouse();
}
在设计师类中,我们定义了几个方法,用于告知设计师我们所提需求,同时增加了图纸类,和工人类。图纸类用于根据用户需求创建图纸,工人类用于设计师创建好图纸后,通知工人根据图纸造房子。与此同时,还定义了一个 build()
方法,一旦图纸完成,就调用 build()
方法通知工人建造房子。
3. 创建图纸类 和 工人类
// 图纸
public class HouseParam {
// height:楼房面积
// width:楼房层数
// color:房子颜色
private double height = 120.00;
private double width = 2;
private String color = "白色";
public double getHeight() {
return height;
}
public double getWidth() {
return width;
}
public String getColor() {
return color;
}
public void setHeight(double height) {
this.height = height;
}
public void setWidth(double width) {
this.width = width;
}
public void setColor(String color) {
this.color = color;
}
public HouseParam() {
}
@Override
public String toString() {
return "画出来的图纸:HouseParam{" +
"height=" + height +
", width=" + width +
", color='" + color + '\'' +
'}';
}
}
// 工人类
public class Worker {
// 拿到图纸
private HouseParam mHouseParam;
// 工作,盖房子
public void setHouseParam(HouseParam houseParam){
mHouseParam = houseParam;
}
// 交付
public House buildHouse(){
House house = new House();
house.setColor(mHouseParam.getColor());
house.setWidth(mHouseParam.getWidth());
house.setHeight(mHouseParam.getHeight());
return house;
}
}
4. 用户类构造房子
public class UserClient {
public static void main(String[] args) {
// 找到建筑公司
// 第一次提出需求
DesignPerson designPerson = new DesignPerson();
designPerson.addColor("白色");
designPerson.addWidth(120.00);
designPerson.addHeight(4);
//第二次提出需求
designPerson.addColor("红色");
designPerson.addWidth(140.00);
designPerson.addHeight(2);
// ---盖房子过程
House house = designPerson.build();
System.out.println(house);
}
我们可以看到,用户不需要知道房子如何构造的,只要传入参数,都可以建造出来。看过 OKHttp
源码的都知道,OKHttpClient
就是通过构建这模式创建出来的,源码中传入参数写法是链式调用,这边我们也可以修改一下:
// 设计师
public class DesignPerson {
// 画图纸
private HouseParam mHouseParam;
// 员工
private Worker mWorker;
public DesignPerson() {
mHouseParam = new HouseParam();
mWorker = new Worker();
}
/**
* 增加楼层
*/
public DesignPerson addHeight(double height){
mHouseParam.setHeight(height);
return this;
}
/**
* 增加面积
*/
public DesignPerson addWidth(double width){
mHouseParam.setWidth(width);
return this;
}
/**
* 增加颜色
*/
public DesignPerson addColor(String color){
mHouseParam.setColor(color);
return this;
}
/**
* 把图纸给工人
* 工人说房子盖好了
* @return
*/
public House build(){
mWorker.setHouseParam(mHouseParam);
return mWorker.buildHouse();
}
}
可以看到这边我把每个用户提需求,设计师根据需求改图纸的方法都返回设计师自己类,那么我们在给设计师提需求的时候,就可以使用链式调用的方法传递参数。
// 用户类
public class UserClient {
public static void main(String[] args) {
House house = new DesignPerson().addColor("红色")
.addHeight(130.00)
.addWidth(2)
.build();
}
}
建造者模式说的简单一点就是把复杂的对象的创建过程封装,我们只需传入参数值,无需关心内部实现。学习设计模式的时候不能很死板,建造者设计模式不同的人使用,会有不同的写法,我们只要掌握核心的思想就能根据业务需求,写出我们自己的建造者设计模式。
写在文末
纸上得来终觉浅,绝知此事要躬行。 《冬夜读书示子聿》-- 陆游
至此,建造者设计模式就说完了,各位看官食用愉快。