静态工厂方法

来源:互联网 发布:淘宝350模板自助开通 编辑:程序博客网 时间:2024/06/16 14:30
<span style="font-size:18px;"></pre>转载:effective java创建和销毁对象1)如何创建对象 2)如何避免创建对象;3)管理对象销毁对象1 考虑用静态工厂方法代替构造器1)构造器创建对象;2)静态工厂方法创建对象优势:1)有名称:如果构造器的从那时本身没有确切地描述正被返回的对象,那么具有适当名称的静态工厂方法会更容易使用。便于阅读和维护2)不必在每次调用他们的时候都创建一个新对象:可以使用预先构建好的实例,或者将构建好的实例缓存起来,进行重复利用,避免不必要的重复对象。3)他们可以返回原返回类型的任何子类型的对象:更加灵活<span style="white-space:pre"></span>例如:服务提供框架,以JDBC为例。多个服务提供者实现一个服务,系统为服务提供的客户端提供多个实现,把他们从实现中解耦出来。<span style="white-space:pre"></span>服务接口:提供者实现;提供者注册API;服务访问API。服务访问API就是灵活的静态工厂。Connection就是它的服务接口,DriverManager.regiesterDriver是提供来注册API。DriverManager.getConnection是服务访问API4 )创建参数化类型实例时,代码变的更加简单缺点:<p>1 类如果不含共有的或者受保护的构造器,就不能被子类化</p><p></p><p>实例</p><p></p><pre name="code" class="java">//Service provider framework sketch</span>//Service interfacepublic interface service{//Serivce-specific methods}//Service provider interfacepublic interface Provider{ Service new Service();}//Noninstantiable class for service registration and accesspublic class Services{private Services(){} //prevents instantiation//Maps service name toservicesprivate static final Map<String,Provider> prividers = new CocurentHashMap<String,Provider>();public static final String DEFAULT_PROVIDER_NAME="<def>";//Provider registration APIpublic static void registerDefaultProvider(Provider p){registerProvider(DEFAULT_PROVIDER_NAME,P);}public static void registerProvider(String name, Provider p){provider.put(name, p);}//Service access APIpublic static Service newInstance(){return newInstance(DEFAULT_PROVIDER_NAME);}public static Service newInstance(String name){Provider p = provider.get(name);if(null == p){ throw new IllegaleArgumentException("provider name cannot be null")}return p.newService();}}


0 0
原创粉丝点击