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();
新闻热点
疑难解答