一.定义:
建造者模式属于创建型模式,是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
二.解释和作用:
建造者模式中封装了复杂的建造过程和细节,提供简单的创建方法,使用者不需要知道其中复杂的建造过程和细节,只要提供指定对象的类型和内容就可以直接创建出复杂的对象。
例如:用户需要买一台电脑,他不需要知道电脑的cpu、内存、硬盘等是怎么制造和组装起来的,只需要提供需要购买的电脑品牌和型号,就可以直接购买使用了。
三.模式角色:
1.Product(产品角色):定义具体产品的类,如产品有哪些东西组成。
2.Builder(抽象创建产品角色):创建产品的抽象接口。
3.ConcreteBuilder(实际创建产品角色):继承Builder,实际创建产品过程的类。
4.Director(指挥者角色):分配去创建产品的角色。
举例说明:
老板叫你写一份活动策划方案:
(1)产品角色(Product):方案-包含时间、人物、地点:
public class ActivityPlan {
private String mTime;
private String mPeople;
private String mAddress;
public void setmTime(String mTime) {
this.mTime = mTime;
}
public void setmPeople(String mPeople) {
this.mPeople = mPeople;
}
public void setmAddress(String mAddress) {
this.mAddress = mAddress;
}
}
(2)抽象创建产品角色(Builder)
public abstract class Bulider {
public abstract void writeTime();//写时间
public abstract void writePeople();//写人物
public abstract void writeAddress();//写地点
public abstract ActivityPlan write();//返回写好的文档
}
(3)实际创建产品角色(ConcreteBuilder)
public class ConcreteBuilder extends Bulider{
private ActivityPlan mPlan = new ActivityPlan();
@Override
public void writeTime(String time) {
mPlan.setmTime(time);
}
@Override
public void writePeople(String people) {
mPlan.setmPeople(people);
}
@Override
public void writeAddress(String address) {
mPlan.setmAddress(address);
}
@Override
public ActivityPlan write() {
return mPlan;
}
}
(4)指挥者角色(Director)
public class Director {
private Bulider mBulider = null;
public Director(Bulider bulider){
mBulider = bulider;
}
//老板叫你写方案
public void toWrite(String time,String people,String address){
mBulider.writeTime(time);
mBulider.writePeople(people);
mBulider.writeAddress(address);
}
}
(5)具体使用:
Bulider bulider = new ConcreteBuilder();
Director director = new Director(bulider);
director.toWrite("2019-03-22","小明","广场");
四.模式优缺点:
1.优点:
(1)具有良好的封装性,隐藏内部构建产品的过程及细节。
(2)建造者之间相互独立,易于扩展,相互之间不受影响。
2.缺点:
(1)使用范围限制:创建的产品具有较多的共同点,如产品差异较大,不适合使用该模式。
(2)如果产品内部接口复杂,将导致系统变得很庞大。
五.在Android中的使用:
建造者模式在Android中很多地方多有使用到,如:
1.AlertDialog:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("对话框")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
2.Retrofit
private Retrofit getRetrofit(String url){
return new Retrofit.Builder()
.baseUrl(url)
.client(MyOkHttpClient.getInstance().getOkHttpClient())
.addConverterFactory(FastConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
}