您的位置:首页 > 其它

用静态工厂方法代替构造函数

2012-03-28 21:18 127 查看
package EffectiveJava;

import java.util.HashMap;
import java.util.Map;
import static java.lang.System.out;
interface Service{
//里面可以提供操作服务的方法
void say();
}
// 提供都接口,其提供一个返回服务的方法
interface Provider{
Service newService();// 返回服务的方法
}
class Services{
private Services() {}
// 提供一个注册服务、取得 服务的依法
private static Map<String,Provider> providers = new HashMap<String,Provider>();
public static final String DEFAULT = "DEFAULT";
public static void registerProvider(String name,Provider provider)
{
providers.put(name, provider);
}
public static Service newInstance(String name) {
Provider p = providers.get(name);
if(p == null)
throw new IllegalArgumentException(name+" not register");
return p.newService();
}
public static Service newInstance() {
return providers.get(DEFAULT).newService();
}
}
public class ProviderService  {

private  static Provider CLOSE = new Provider() { // 定义一个provider,用于提供服务
@Override
public Service newService() { // 重写provider 接口里的方法
return new Service() { // 返回一个Service接口的匿名内
public void say() {
out.println("CLOSE Service alreay loading...");
}
};
}
};
private static Provider JUMP = new Provider() {
public Service newService() {

return new Service() {
public void say() {
out.println("JUMP Service alreay loading...");
}
};
}
};
public static void main(String argsp[]) {
Services.registerProvider("close", CLOSE);
Services.registerProvider("jump", JUMP);
Services.newInstance("close").say();
Services.newInstance("jump").say();

}
}
/*
* 		服务提供者框架
* 			Service :服务接口
* 			Provider:提供者接口,用于提供服务,有一个得到服务的方法
* 			Services:提供服务类,给定String服务名,得到其相应的服务
* 		因为是给定String 名,得到相应的服务对象,可以得到反射得到相应的类再实例化,也可以在
* 		Services 类中维护一个Map<String,Provider> 的映射表,在得到一个服务之前要注册,也就是map.put(String),
* 		放进注册中,在得到newInstance的时候,再map.get(String) 就行
* 		从里面得到相应的Provider,再求得其
* 		提供的服务对象
* */


用静态工厂方法代替构造函数的优点

1.不一定要创建对象

2.可以返回指定类型的对象,如果返回集合类时,我们可以返回一个Collection 接口的对象

下面是服务提供者框架:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: