从对象创建和引用小议解耦
2010-07-12 00:00:00 来源:WEB开发网通过 清单 2 所示的第二种实现方式,清单 1 实现方式的缺点得到解决,但是值得注意的是,耦合并没有消除,而是转移到 ExpressionEvaluatorFactory 工厂类中。当需要换成其他 ExpressionEvaluator 的实现时,仍然需要修改并重新编译 ExpressionEvaluatorFactory 类,当然优势自然是客户端代码无需修改了。在此我们引入第三种实现方式。
清单 3. 计算器实现方式三 (Service Look-up)
public class ExpressionEvaluatorFactory {
public static final String EXPRESSION_EVALUATOR_PROPERTY_NAME="ExpressionEvaluator";
private static final String DEFAULT_EXPRESSION_EVALUATOR_IMPL
= "ExpressionEvaluatorImpl";
public static ExpressionEvaluator createExpressionEvaluator() {
String implClassName = loadFromSystemProperty();
if (implClassName == null) {
implClassName = loadFromJREPropertyFile();
if (implClassName == null) {
implClassName = loadFromServiceEntryURL();
if (implClassName == null) {
implClassName = DEFAULT_EXPRESSION_EVALUATOR_IMPL;
}
}
}
Class cls = loadClass(implClassName);
try {
return (ExpressionEvaluator) cls.newInstance();
} catch (Exception e) {
throw new ExpressionEvaluatorException("Fail to create instance of ["
+ implClassName + "]", e);
}
}
private static Class loadClass(String implClassName) {
ClassLoader cl = Thread.currentThread().getContextClassLoader();
try {
if (cl != null) {
return cl.loadClass(implClassName);
} else {
return Class.forName(implClassName);
}
} catch (Exception e) {
throw new ExpressionEvaluatorException("Fail to load class ["
+ implClassName + "]", e);
}
}
......
}
更多精彩
赞助商链接