OkHttp学习(四) 3.10.0版本源码阅读之构建者设计模式

系列文章

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 + '\'' +
                '}';
    }

}

总结

构建者模式的精髓是有一个复制(缓存)的过程, 构造器会将用户给的参数先保留一份,在真正构造对象的时候, 将所有的参数全部传递给对象,从而构造出完整的对象。而且构建者还可以给默认参数,在用户没有设置的时候,传递默认参数给对象。构建者的链式调用看起来更清晰简洁,特别是参数比较多的时候,构建者模式更清晰。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值