考虑使用静态工厂方法代替构造函数。
一、静态方法的一个好处是,与构造函数不同,静态方法具有名字。
使用场合:
1、方法名字和参数列表组合,可明确的表达被创建对象的状态。构造函数却无此效果。
2、如果有多个构造函数,且有相同的原型,则可使用之避免重复。
二、静态方法的第二个好处是,与构造函数不同,他们每次被调用的时候,不要求非的创建一个新的对象。
使用场合:
1、可缓存被构造好的对象,避免每次都去创建对象的性能开销。如,单例模式。
2、可控制类实例的存在。如,使非可变类不会有两个相等的实例子存在。
三、静态方法的第三个好处是,与构造函数不同,他们可以返回一个返回类型的子类型的对象。
1、待返回的子类和其接口类(作为函数返回类型)结合,可隐藏实现细节,并且迫使客户通过接口来引用被返回的对象。
2、根据属性参数,可动态返回接口的不同实现类,从而提供软件灵活性。
应用:Jivi中的论坛工厂实现:
private static String className = "com.jivesoftware.forum.database.DbForumFactory";
public static ForumFactory getInstance(Authorization authorization) {
//If no valid authorization passed in, return null.
if (authorization == null) {
return null;
}
if (factory == null) {
synchronized(initLock) {
if (factory == null) {
// Note, the software license expressely forbids
// tampering with this check.
//LicenseManager.validateLicense("Jive Forums Basic", "2.0");
String classNameProp =
JiveGlobals.getJiveProperty("ForumFactory.className");
if (classNameProp != null) {
className = classNameProp;
}
try {
//Load the class and create an instance.
Class c = Class.forName(className);
factory = (ForumFactory)c.newInstance();
}
catch (Exception e) {
System.err.println("Failed to load ForumFactory class "
+ className + ". Jive cannot function normally.");
e.printStackTrace();
return null;
}
}
}
}
//Now, create a forum factory proxy.
return new ForumFactoryProxy(authorization, factory,
factory.getPermissions(authorization));
}
四、静态方法的主要缺点是,类如果不含公有的或受保护的构造函数,就不能被子类化。
五、静态方法的第二个缺点是,他们与其他的静态方法没任何区别。
习惯命名:
1、 valueOf 实现一些有效的类型转换操作。如:Integer Integer.valueOf(int i);
2、 getInstance() 返回类的实现对象。在singleton中,返回类的唯一实现对象。
|