android源码中和第三方框架中常见的Builder模式

Builder模式

Builder模式也是Java中常用的设计模式,在Android源码中和一些第三方框架中也很常用;

Builder的使用场景

1.相同的方法不同的执行顺序,产生不同的结果
2.多个部件,都可以装配到一个对象中,但是产生的运行结果又不同
3.产品类非常的复杂,或者产品类中的调用顺序不同产生了不同的作用
4.当初始化一个对象特别复杂,如参数多,且有很多的默认值时

Builder的简单实现

如果工厂去造一辆车,将车最基本的部件作为一个抽象类
public abstract class Car {
 protected String mEngine;
 protected String mType;
 protected String mColor;
 protected Car(){}
 //设置发动机
 public void setEngine(String engine){
    this.mEngine=engine;
 }
 //设置车型
 public void setType(String type){
    this.mType=type;
 } 
 //设置颜色
 public abstract void setColor();
@Override
public String toString() {
    return "Car [mEngine=" + mEngine + ", mType=" + mType + ", mColor="
            + mColor + "]";
}

}
例如现在我要组装一辆车小A
public class BlueBird extends Car{
protected BlueBird(){

}
 //设置车的颜色
    @Override
    public void setColor() {
    mColor="蓝色";

    }


}
组装一辆车所需要的基本过程
public abstract class Builder {
    public abstract void buildEngine(String engine);
    public abstract void buildType(String type);
    public abstract void buildColor();
    public abstract Car create();
}
组装小A车所需要的基本过程
public  class BlueBirdBuilder extends Builder {
    private Car mCar=new BlueBird();
    @Override
    public void buildEngine(String engine) {
        mCar.setEngine(engine);
    }

    @Override
    public void buildType(String type) {
        mCar.setType(type);
    }

    @Override
    public void buildColor() {
        mCar.setColor();
    }

    @Override
    public Car create() {
        return mCar;
    }

}
开始组装汽车的机械臂
public class Plant {
        Builder mBuilder=null;
        public Plant (Builder builder){
            this.mBuilder=builder;
        }
        public void build(String engine,String type) {
            mBuilder.buildColor();
            mBuilder.buildEngine(engine);
            mBuilder.buildType(type);

        }
}
启动机械臂并且设置如汽车的基本参数
public static void main(String[] args) {
        // TODO Auto-generated method stub
            Builder builder=new BlueBirdBuilder();
            Plant plant=new Plant(builder);
            plant.build("1.5T", "小型车");
            System.out.println(builder.create().toString());

    }

上述的示例中通过BlueBirdBuilder来构建Car对象,而Plant封装了构建复杂产品对象的过程,对外部隐藏了具体的细节。Builder与Plant一起将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以构建不同的对象。但是在开发中Plant通常会被省略,而是直接使用一个Builder来进行对象的组装,这个Builder通常为链式调用,代码如下:new A().setC().setB().create();
那么上述的代码如何改为链式调用呢?我们只要从Builder 这个类下手将返回的void 改为Builder类型代码如下:

public abstract class Builder {
    public abstract Builder buildEngine(String engine);
    public abstract Builder buildType(String type);
    public abstract Builder buildColor();
    public abstract Car create();
}

BlueBirdBuilder继承了Builder所以也要进行修改

public  class BlueBirdBuilder extends Builder {
    private Car mCar=new BlueBird();
    @Override
    public Builder buildEngine(String engine) {
        mCar.setEngine(engine);
        return this;
    }

    @Override
    public Builder buildType(String type) {
        mCar.setType(type);
        return this;
    }

    @Override
    public Builder buildColor() {
        mCar.setColor();
        return this;
    }

    @Override
    public Car create() {
        return mCar;
    }

}

这样一个链式调用就组成了:
mBuilder.buildColor().buildEngine(engine).buildColor();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值