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();
|
新聞熱點
疑難解答