系列文章
OkHttp学习(一) OSI七层模型和TCP四层模型
OkHttp学习(二) 3.10.0版本的简单使用及其流程梳理
OkHttp学习(三) 3.10.0版本源码阅读之线程池
OkHttp学习(四) 3.10.0版本源码阅读之构建者设计模式
OkHttp学习(五) 3.10.0版本源码阅读之责任链设计模式
OkHttp学习(六) 3.10.0版本源码中的拦截器
OkHttp学习(七) 手写OkHttp之框架搭建
OkHttp学习(八) 手写OkHttp之网络请求实现
OkHttp学习(九) OkHttp的连接池手写实现
OkHttp的构建者模式
// 创建OkHttpClient,构建者模式
OkHttpClient httpClient = new OkHttpClient.Builder().build();
// 创建Request,构建者模式
Request request = new Request.Builder()
.get()
.url("https://www.baidu.com").build();
构建者设计模式
构建者模式的定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,这是官方定义,通俗的说就是:构建者模式就是如何一步步构建一个包含多个组成部件的对象,相同的构建过程可以创建不同的产品
构建者模式的特点
构建者模式是一种创建型模式,适用于那些流程固定「顺序不一定固定」,建造的目标对象会有所改变这种场景「比如画一条狗,这个目标不变,但是不同的是有黄狗,胖狗,瘦狗等」,还有一种场景是代替多参数构造器
构建者模式的作用
1、用户不知道对象的建造过程和细节就可以创建出复杂的对象「屏蔽了建造的具体细节」
2、用户只需给出复杂对象的内容和类型可以创建出对象
3、构建者模工按流程一步步的创建出复杂对象
构建者模式的例子
我们在生活中盖房子,一般就是打地基,盖框架「用砖头或钢筋混凝土」,然后是粉刷。基本上就是这个路子。当然我们这些工作全部可以自己做,可也以找几个工人去干,当然还可以可以直接找一个设计师,直接说我就要这样的房子,然后就不管了,最后问设计师「设计师给一张纸给工人,工人就啪啪的干了」验收房子即可「至于你是如何建的过程我不关心,我只要结果」
具体代码如下:
用户
// 用户
public class UserClient {
public static void main(String[] args) {
House house = new DisignPerson().addColor("白色").addWidth(100).addHeight(6).addHeight(9).addHeight(8).build();
System.out.println(house);
}
}
用户找设计师谈论确定需求之后就可以等着验收房子了。
/**
* 设计师
*/
public class DisignPerson {
// 画图纸
private HouseParam houseParam;
// 员工
private Worker worker;
public DisignPerson() {
houseParam = new HouseParam();
worker = new Worker();
}
/**
* 增加楼层 -- 画图纸的过程
*/
public DisignPerson addHeight(double height) {
houseParam.setHeight(height);
return this;
}
/**
* 增加面积 -- 画图纸的过程
*/
public DisignPerson addWidth(double width) {
houseParam.setWidth(width);
return this;
}
/**
* 增加颜色 -- 画图纸的过程
*/
public DisignPerson addColor(String color) {
houseParam.setColor(color);
return this;
}
/**
* 把图纸给工人
* 员工说房子盖好了
* @return
*/
public House build() {
worker.setHouseParam(houseParam);
return worker.buildHouse();
}
}
设计是从用户那里获取到房子的需求, 然后将需求交于工人构造房子。
/**
* 300个员工
*/
public class Worker {
// 拿到图纸
private HouseParam houseParam;
public void setHouseParam(HouseParam houseParam) {
this.houseParam = houseParam;
}
// 工作 盖房子
// 交付
public House buildHouse() {
// 盖房子 实例
House house = new House();
house.setColor(houseParam.getColor());
house.setHeight(houseParam.getHeight());
house.setWidth(houseParam.getWidth());
return house;
}
}
工人根据图纸构造出房子。
/**
* 房子的图纸
*/
public class HouseParam {
private double height;
private double width;
private String color = "白色";
public HouseParam() {
}
public HouseParam(double height, double width, String color) {
this.height = height;
this.width = width;
this.color = color;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width = width;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
@Override
public String toString() {
return "画出来的图纸:HouseParam{" +
"height=" + height +
", width=" + width +
", color='" + color + '\'' +
'}';
}
}
/**
*最终建的房子
*/
public class House {
private double height;
private double width;
private String color;
public House() {
}
public House(double height, double width, String color) {
this.height = height;
this.width = width;
this.color = color;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width = width;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
@Override
public String toString() {
return "具体建造出来的房子>>>>:HouseParam{" +
"height=" + height +
", width=" + width +
", color='" + color + '\'' +
'}';
}
}
总结
构建者模式的精髓是有一个复制(缓存)的过程, 构造器会将用户给的参数先保留一份,在真正构造对象的时候, 将所有的参数全部传递给对象,从而构造出完整的对象。而且构建者还可以给默认参数,在用户没有设置的时候,传递默认参数给对象。构建者的链式调用看起来更清晰简洁,特别是参数比较多的时候,构建者模式更清晰。