單例模式---孤獨的寂寞

    聲明:文章內容根據大牛博客的內容,自己理解後,給自己做的學習筆記,文末會附上大牛博客地址鏈接。有需要溝通交流的可加我QQ羣:425120333
    說真的,看懂設計模式了,和會用,在這之間還差了N行代碼,每個設計模式都是前人經驗的結晶,先去理解再去用(千萬別在代碼中強行使用)。
    首先,就是單例模式,顧名思義,就是一個類在整個運行期間只會有一個實例,每次獲取到的都是同一實例。實現單例模式的方式各種各樣,
每種方式都有各自的特點,需要根據實際情況進行選擇。
 /**
 * @author caiqibin
 * @introduce:類被調用就創建(可能只是用到類中其他的靜態方法),可能浪費空間
 * 
 */
public class Singleton {
    private static Singleton singleton = new Singleton();

    private Singleton() {

    }

    public static Singleton getSingleton() {
        return singleton;
    }
}

/**
 * @author caiqibin
 * @introduce:單線程下可行,多線程下不能保證單例
 * 
 */
class SingletonA {
    private static SingletonA singleton;

    private SingletonA() {

    }

    public static SingletonA getSingleton() {
        if (singleton == null) {
            singleton = new SingletonA();
        }
        return singleton;
    }
}

/**
 * @author caiqibin
 * @introduce:多線程下也可行,但是加了同步,多了很多等待,浪費時間
 * 
 */
class SingletonB {
    private static SingletonB singleton;

    private SingletonB() {

    }

    public synchronized static SingletonB getSingleton() {
        if (singleton == null) {
            singleton = new SingletonB();
        }
        return singleton;
    }
}

/**
 * @author caiqibin
 * @introduce:雙重檢測校驗,一般來說都可以,而且不會有問題。 
 *                                    創建對象三步走:1分配內存空間,2初始化構造器,3將對象指向分配的內存地址(因爲jvm的指令重排序
 *                                    ,2、3的順序無法保證)所以導致可能出現問題
 */
class SingletonC {
    private static SingletonC singleton;

    private SingletonC() {

    }

    public static SingletonC getSingleton() {
        if (singleton == null) {
            synchronized (SingletonC.class) {
                if (singleton == null) {
                    singleton = new SingletonC();
                }
            }
        }
        return singleton;
    }
}

/**
 * @author caiqibin
 * @introduce:一定不會有問題(要jdk1.5以上才支持volatile關鍵字)
 * 
 */
class SingletonD {
    private static volatile SingletonD singleton;

    private SingletonD() {

    }

    public static SingletonD getSingleton() {
        if (singleton == null) {
            synchronized (SingletonD.class) {
                if (singleton == null) {
                    singleton = new SingletonD();
                }
            }
        }
        return singleton;
    }
}

/**
 * @author caiqibin
 * @introduce:最好的實現方式,沒有限制,不會浪費
 * 
 */
class SingletonBest {

    private SingletonBest() {

    }

    public static SingletonBest getSingleton() {
        return CreateSingletonBest.singleton;
    }

    private static class CreateSingletonBest {
        private static SingletonBest singleton = new SingletonBest();
    }

}
這裏我總共列出了6中,最後這種是最優的,而且沒限制。當然,實際情況下還有其他寫單例的方法,水平有限,還知道其他的請給我留言學習下,謝謝了!
    參考大牛博客鏈接:http://www.cnblogs.com/zuoxiaolong/p/pattern2.html 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章