使用静态工厂方法代替构造方法
使用静态工厂方法的几大好处:
1.可以为它们取名可以让客户端更加方便使用。
Integer.probablePrime();
Integer.natural();
可以分别用来表示获取可能的质数和自然数,清晰易读。
2.不用在每次在每次调用它时创建一个新的对象。
a.预先构建好实例;
b.将构建好的实例存储起来,进行重复利用。
3.它可以返回原类型的任何子类型的对象。
4.在创建参数化类型的实例时,它们使代码变得更加简洁。
使用静态工厂方法的主要缺点
1.类如果不含有共有的或者受保护的构造方法,它就不能被子类化。
2.它与其他静态方法实质上没有任何区别。
不过静态方法有一些惯用的取名:
valueOf
of
getInstance
newInstance
getType
newType
实例
客户端:
public class Test {
private static final Provider DEFALUT_PORVIDER = new Provider() {
@Override
public Service newService() {
return new Service() {
public String toString() {
return "get DEFAULT service!";
};
};
}
};
private static final Provider CUSTOME_PROVIDER = new Provider() {
@Override
public Service newService() {
return new Service() {
public String toString() {
return "get CUSTOME service";
};
};
}
};
public static void main(String[] args) {
/****************************默认服务*********/
//注册服务
Services.registerDefaultProvider(DEFALUT_PORVIDER);
//从提供者那里拿到服务
Service service = Services.newInstance();
System.out.println(service);
/************自定义服务***********/
Services.registerProvider("CUSTOME_PROVIDER", CUSTOME_PROVIDER);
Service service2 = Services.newInstance("CUSTOME_PROVIDER");
System.out.println(service2);
}
}
/**
* 注册服务提供者
* @author TisaKong
* 2015-5-4
*/
public class Services {
private static final String DEFAULT_PROVIDER = "<DEF>";
private static final Map<String , Provider> providers = new ConcurrentHashMap<String, Provider>();
public static void registerProvider(String name , Provider p){
providers.put(name, p);
}
public static void registerDefaultProvider(Provider p){
registerProvider(DEFAULT_PROVIDER, p);
}
public static Service newInstance(){
return newInstance(DEFAULT_PROVIDER);
}
public static Service newInstance(String name){
Provider p = providers.get(name);
if(p == null){
throw new IllegalArgumentException("No provider registered with name:"+name);
}
return p.newService();
}
}
/**
* 服务接口
* @author TisaKong
* 2015-5-4
*/
public interface Service {
// Service-specific methods go here
}
/**
* 服务提供商接口
* @author TisaKong
* 2015-5-4
*/
public interface Provider {
public Service newService();
}