天天看點

用工廠方法替代構造器

代碼樣例

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:所傳回的對象的類可以随着每次調用而發生變化,取決于靜态工廠方法的參數值

------------恢複内容結束------------