写在前面
定义:在设计模式中对Builder模式的定义是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
适用场景:用于构建复杂对象的一种模式,所构建的对象往往需要多步初始化或赋值才能完成。
写法
一般我们创建一个含有少量成员变量类的含参构造方法的时候往往是下面这个样子的:
public class Person {
private int id;
private String name;
private int age;
public Person(int pid, String name, int age) {
this.id = pid;
this.name = name;
this.age = age;
}
}
但是当这个类的成员变量很多的时候,再使用这种方式势必会造成构造方法很繁重,这个时候使用构造者模式Builder可以很好的解决这个问题。在android源码以及很多第三方库中很多地方都使用到了构造者模式,例如:android中创建Dialog,
android中创建�Notification,OkHttp库,Retrofit库等。下面是OkHttp和Retrofit的构建对象的一个例子:
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://api.53iq.com/")
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(okHttpClient)
.build();
十分的清晰可自由配置。那么怎么简单的实现这种模式呢?请看下面:
这里我通过宾馆的一个房间为例子,来进行说明。(一般宾馆一个房间里面是由有很多东西构成,例如:床,空调,电视,衣架,拖鞋,热水壶,茶杯,卫生间...等等。)
public class BedRoom {
//床
private String chuang;
//空调
private String kong_tiao;
//电视
private String dian_shi;
//衣架
private String yi_jia;
//拖鞋
private String tuo_xie;
//热水壶
private String re_shui_hu;
//茶杯
private String cha_bei;
private BedRoom(Builder builder) {
this.chuang = builder.chuang;
this.kong_tiao = builder.kong_tiao;
this.dian_shi = builder.dian_shi;
this.yi_jia = builder.yi_jia;
this.tuo_xie = builder.tuo_xie;
this.re_shui_hu = builder.re_shui_hu;
this.cha_bei = builder.cha_bei;
}
public static class Builder {
//床
private String chuang;
//空调
private String kong_tiao;
//电视
private String dian_shi;
//衣架
private String yi_jia;
//拖鞋
private String tuo_xie;
//热水壶
private String re_shui_hu;
//茶杯
private String cha_bei;
public Builder setChuang(String chuang) {
this.chuang = chuang;
return this;
}
public Builder setKong_tiao(String kong_tiao) {
this.kong_tiao = kong_tiao;
return this;
}
public Builder setDian_shi(String dian_shi) {
this.dian_shi = dian_shi;
return this;
}
public Builder setYi_jia(String yi_jia) {
this.yi_jia = yi_jia;
return this;
}
public Builder setTuo_xie(String tuo_xie) {
this.tuo_xie = tuo_xie;
return this;
}
public Builder setRe_shui_hu(String re_shui_hu) {
this.re_shui_hu = re_shui_hu;
return this;
}
public Builder setCha_bei(String cha_bei) {
this.cha_bei = cha_bei;
return this;
}
public BedRoom build() {
return new BedRoom(this);
}
}
public String getChuang() {
return chuang;
}
public String getKong_tiao() {
return kong_tiao;
}
public String getDian_shi() {
return dian_shi;
}
public String getYi_jia() {
return yi_jia;
}
public String getTuo_xie() {
return tuo_xie;
}
public String getRe_shui_hu() {
return re_shui_hu;
}
public String getCha_bei() {
return cha_bei;
}
@Override
public String toString() {
return "BedRoom{" +
"chuang='" + chuang + '\'' +
", kong_tiao='" + kong_tiao + '\'' +
", dian_shi='" + dian_shi + '\'' +
", yi_jia='" + yi_jia + '\'' +
", tuo_xie='" + tuo_xie + '\'' +
", re_shui_hu='" + re_shui_hu + '\'' +
", cha_bei=" + cha_bei +
'}';
}
}
客户端调用
public static void main(String[] args) {
BedRoom bedRoom = new BedRoom.Builder()
.setChuang("圆床")
.setDian_shi("小米电视")
.setKong_tiao("格力空调")
.setYi_jia("衣架5个")
.setRe_shui_hu("热水壶1个")
.setCha_bei("茶杯2个")
.setTuo_xie("拖鞋2双")
.build();
System.out.println(bedRoom);
}
运行结果:
BedRoom{chuang='圆床', kong_tiao='格力空调', dian_shi='小米电视', yi_jia='衣架5个', tuo_xie='拖鞋2双', re_shui_hu='热水壶1个', cha_bei=茶杯2个}
总结
构造者模式,一般主要是通过实现一个Builder静态内部类,然后Builder中添加与外部类同样的成员变量,为各个成员变量写set方法同时返回这个对象本身即return this,最后适用build()方法构建一个外部类的实例,然后将自身的成员变量的值赋值到这个外部类。当然写法不只是这一种,这里只是一种最常见的写法,如有错误希望大家指正谢谢。
网友评论