代碼樣例
public class Singleton {
private static Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
instance = instance == null ? new Singleton() : instance;
return instance;
}
}
靜态工廠方法相較于構造器的優勢
優勢1:它們有名字
如果構造器本身沒有确切的描述正被傳回的參數,那麼具有适當名稱的靜态工廠方法會更容易使用,産生的用戶端代碼也具有易讀性。
優勢2:不必再每次調用的時候都建立一個新的對象
不可變類可以使用預先建構好的執行個體,或者将建構好的執行個體緩存起來,進行重複的利用,進而避免建立不必要的重複對象。
優勢3:可以反回原傳回類型的任意子類型
讓我們在選擇傳回類型的時候具有很多靈活性。
public abstract class Shape {
private final static String PACKAGE_NAME = "com.chenxinbao.effectivejava.";
public static Shape getInstance(String className)
throws InstantiationException, IllegalAccessException, ClassNotFoundException {
Shape isntance = (Shape) Class.forName(PACKAGE_NAME + className).newInstance();
return isntance;
}
@Override
public String toString() {
return "Shape [getClass()=" + getClass() + ", hashCode()=" + hashCode() + ", toString()=" + super.toString()
+ "]";
}
private class Rectangle extends Shape {
}
private class Circle extends Shape {
}
public static void main(String[] args)
throws InstantiationException, IllegalAccessException, ClassNotFoundException {
Shape shape = Shape.getInstance("Circle");
System.out.println(shape);
}
}
輸出結果:
Shape [getClass()=class com.chenxinbao.effectivejava.Circle, hashCode()=1829164700, toString()=com.chenxinbao.effectivejava.Circle@6d06d69c]
優勢4:所傳回的對象的類可以随着每次調用而發生變化,取決于靜态工廠方法的參數值
------------恢複内容結束------------