<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 interface
public interface service
{//Serivce-specific methods}
//Service provider interface
public interface Provider
{ Service new Service();}
//Noninstantiable class for service registration and access
public class Services
{
private Services(){} //prevents instantiation
//Maps service name toservices
private static final Map<String,Provider> prividers = new CocurentHashMap<String,Provider>();
public static final String DEFAULT_PROVIDER_NAME="<def>";
//Provider registration API
public static void registerDefaultProvider(Provider p)
{
registerProvider(DEFAULT_PROVIDER_NAME,P);
}
public static void registerProvider(String name, Provider p)
{
provider.put(name, p);
}
//Service access API
public 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();
}
}
静态工厂方法
最新推荐文章于 2022-09-14 11:17:28 发布