Android 设计模式 之 建造者模式

子曰:温故而知新,可以为师矣。 《论语》-- 孔子


本篇文章主要学习 建造者 设计模式。它是 创建型 设计模式的一种。


什么是建造者模式???

定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

建造者模式又被称为生成器模式,它是创建一个复杂对象的创建型模式,将构建复杂对象的过程和它的部件解耦,使得构建过程和部件的表示分离出来。

我们可以举个例子来说明一下:

比如说我们要自己 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();
    }
}

建造者模式说的简单一点就是把复杂的对象的创建过程封装,我们只需传入参数值,无需关心内部实现。学习设计模式的时候不能很死板,建造者设计模式不同的人使用,会有不同的写法,我们只要掌握核心的思想就能根据业务需求,写出我们自己的建造者设计模式。



写在文末

纸上得来终觉浅,绝知此事要躬行。 《冬夜读书示子聿》-- 陆游

至此,建造者设计模式就说完了,各位看官食用愉快。


码字不易,如果本篇文章对您哪怕有一点点帮助,请不要吝啬您的点赞,我将持续带来更多优质文章

发布了9 篇原创文章 · 获赞 9 · 访问量 5021

猜你喜欢

转载自blog.csdn.net/wild_onlyking/article/details/104362802
今日推荐