Builder模式:(对外部隐藏构建细节)
将对象的构建过程和它的表示隔离,同样的构建过程,创建不同的表示。
典型用例:
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
context).threadPriority(Thread.NORM_PRIORITY - 2)
.denyCacheImageMultipleSizesInMemory()
.discCacheFileNameGenerator(new Md5FileNameGenerator())
.tasksProcessingOrder(QueueProcessingType.LIFO)
.writeDebugLogs() // Remove for release app
.build();
ImageLoader.getInstance().init(config);
运用场景:
1>产品复杂(不同种类,不同规格,不同颜色等等)
2>初始化对象复杂(参数多,且都有默认值时,不允许用户随意改动)
3>多个零件都可以装到一个对象中,运行结果却不同(电脑组装完毕,开机之后,品牌不同)
4>产品的成产规范相同(固定流程,例如成产电脑,或者电子产品)
5>用户可以自定义产品new ClassA().buildA().buildB().create();//返回一种特定产品
Product:产品,抽象类
Builder:产品生产规范,抽象类
ConcreteProduct:具体产品,Product的子类
ConcreteBuilder:具体生产规范,Builder的子类
Director:统一组建过程
示例代码:
/**
*计算机抽象类
*/
public abstract class Product{
protected String cpu;
protected String display;
protected String os;
public abstract void setCpu();
public abstract void setDisplay();
public abstract void setOs();
@Override
public String toString(){
return "计算机[CPU:"+cpu+"显示器:"+display+"操作系统:"+os+"]";
}
}
/**
*计算机具体类(细节)
*/
public class ConcreteProduct{
@Override
public void setOs(){
os = "Mac OS X 10.10";
}
}
/**
*抽象Builder类
*/
public abstract class Builder{
public abstract buildCpu(String cpu);
public abstract buildDisplay(String diaplay);
public abstract buildOs();
public abstract Product build();
}
/**
*具体的Builder类
*/
public class ConcreteBuilder extends Builder{
private Product product = new ConcreteProduct();
@Override
public void buildCpu(String cpu){
product.setCpu(cpu);
}
@Override
public void buildDisplay(String diaplay){
product.setDisplay(diaplay);
}
@Override
public void buildOs(){
product.setOs();
}
@Override
public Product build(){
return product;
}
}
/**
*安装电脑(封装为一个类,外部统一调用)
*/
public class Director{
Builder builder = null;
private Director director = null;
Private Director(){
}
public Director getInstance(){
if(director == null){
director = new Director();
}
return director;
}
/*
*初始化设置(比如这里,统一了电脑的系统型号等)
*/
public void init(Builder builder){
this builder = builder;
}
public void A(){}
public void B(){}
public void C(){}
}
/**
*测试类(外部调用Director)
*/
public class Test{
Builder builder = new ConcreteBuilder().builder.buildCpu("因特尔").builder.buildDisplay("Retina显示器").builder.buildOs().build();
Director director = New Director().getIntance().init(builder);//初始化设置,目的:统一生产规格
director.A();//在统一规格下,增加电脑的新功能(需要新参数,再进行扩充,后续给出)
System.out.println("成功安装"+new ConcreteBuilder.build().toString());
}
实例总结:
Builder模式的目的就是,把复杂的生产过程,以清晰简单的形式,展现出来。
Director:统一安装过程,将电脑安装的细节隐藏起来。
是不是想起了AlerDialog的构建过程
AlerDialog.Builder builder = new AlerDialog.Builder(context);
builder.setIcon(R.drawanle.icon).setTitle(“Title”);
builder.create().show();