静态工厂方法

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值