1. 程式人生 > >單例,靜態工廠,構造器

單例,靜態工廠,構造器

1.effective in java 第一條,儘量用靜態方法代替構造器

1.靜態工廠不必每次都建立新物件。 如Boolean.valueof(boolean)

## 例項受控的類,確保是singleton(單例),或者是不可例項化的。

單例   singleton 僅被例項化一次的類,

注意確保如下幾點

singleton構造方法必須私有,使得無法通過new來生成第二個例項,

確保物件僅有一個,尤其在多執行緒下用到靜態工廠方法

確保反序列化時不會重新建立物件。

多種方法編寫單例類物件     (餓漢單例模式)  

 1.   // 靜態工廠方法 單例方法1   餓漢單例模式
    private static final SingleInstance s = new SingleInstance();

    public static SingleInstance getInstance() {
        return s;
    }


  //公有的靜態域直接返回單例的物件

2. 靜態工廠懶漢模式

  // 懶漢模式
    private static SingleInstance sss;

    // 加鎖後導致不必要資源浪費,每次都同步
    public synchronized static SingleInstance get() {
        if (sss == null) {
            sss = new SingleInstance();
        }
        return sss;
    }

3. DLC靜態工廠方法,舉個標準用法,ImageLoader原始碼裡的
   private volatile static ImageLoader instance;

    /**
     * Returns singleton class instance
     */
    public static ImageLoader getInstance() {
        if (instance == null) {
            synchronized (ImageLoader.class) {
                if (instance == null) {
                    instance = new ImageLoader();
                }
            }
        }
        return instance;
    }

//程式碼裡通過2次判空來同步必要的情況


// 由於記憶體模型,靜態工廠方法多執行緒情況下也會有問題,即使用了雙重鎖定也一樣

所以加上修飾符:

volatile 是1.5後優化JAVA記憶體模型的關鍵字,DLC標準寫法如上,ImageLoader內部就是如此

3.  java1.5後可以通過列舉

上述幾種情況在反序列化時重新生成物件。只有列舉不會。

4.靜態內部類    推薦

5.hashmap裡的單例