// Service provider framework sketch - Service provider interface
package com.xjtu.cruise.chapter02.item01;
public interface Provider {
Service newService();
}
// Simple test program for service provider framework
package com.xjtu.cruise.chapter02.item01;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
Services.registerDefaultProvider(DEFAULT_PROVIDER);
Services.registerProvider("comp", COMP_PROVIDER);
Services.registerProvider("armed", ARMED_PROVIDER);
Service s1 = Services.newInstance();
Service s2 = Services.newInstance("comp");
Service s3 = Services.newInstance("armed");
System.out.printf("%s %s %s\n", s1, s2, s3);
}
private static Provider DEFAULT_PROVIDER = new Provider() {
@Override
public Service newService() {
return new Service() {
@Override
public String toString() {
return "Default service";
}
};
}
};
private static Provider COMP_PROVIDER = new Provider() {
@Override
public Service newService() {
return new Service() {
@Override
public String toString() {
return "Complementary service";
}
};
}
};
private static Provider ARMED_PROVIDER = new Provider() {
@Override
public Service newService() {
return new Service() {
@Override
public String toString() {
return "Armed service";
}
};
}
};
}
但是,我们也应该很清楚的认识到使用静态工厂方法带来的隐患:
1. 如果类中没有提供public或protected的构造器,将造成该类不能子类化
不能子类化在某些情况下是无法接受的,但是,这样也有好处:策略模式教导我们应该多用组合而不是继承,当一个类不能子类化后,组合将是你唯一的选择。
2. 静态工厂方法和其他静态方法本质上并没有区别
前已经述及,静态工厂方法本质上就是一个静态方法。这使得使用人员在查阅JavaDoc时,可能将其和一般的静态方法混淆,造成使用上的困扰。
总结:
鉴于构造器有各种各样的不便,可以考虑用静态方法代替。它会给我们带来以下优缺点:
优点:
1) 有名称;
2)不必在每一次创建时都提供新对象;
3) 返回子类型;
4) 使代码更加简单。
缺点:
1)如果类中没有提供public或protected的构造器,将造成该类不能子类化;
2)静态工厂方法和其他静态方法本质上并没有区别。