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();