1. 程式人生 > >單例模式(一)

單例模式(一)

1,私有化構造器,私有一個例項物件,通過靜態方法,讓外部呼叫私有化的例項物件
/**
 * 懶漢式
 * 單例的標準模式,使用判斷來進行延遲載入,
 * 使用synchronized關鍵字來避免多執行緒問題,但影響效能
 */
class Singleton{

    private static Singleton instance = null;
    private Singleton(){}
    public synchronized static Singleton GetSinsrance1(){
        if(instance == null)
            return new Singleton();
        return instance;
    }
}

/**
 * 餓漢式
 * 在宣告物件的時候就開始初始化物件,但初始化比較負責,會導致程式緩慢
 */
class Singleton1 {

    private static Singleton1 instance = new Singleton1();
    private Singleton1(){};
    public static Singleton1 GetInstance(){
        return instance;
    }
}

/**
 *雙重加鎖機制,懶漢式的加強版
 * 講synchronized放到例項化方法內,並使用volatile關鍵字修飾物件,既避免了多執行緒問題,
 * 又不會影響效能,但volatile本身有問題,少用
 */
class Singleton2{

    private static volatile Singleton2 instance = null;
    private Singleton2(){}

    public static Singleton2 GetInstance(){
        if(instance == null){
            synchronized (Singleton2.class){
                if(instance == null)
                    return new Singleton2();
            }
        }
        return instance;
    }
}

/**
 * Lazy initialization holder class
 * 這裡建立了一個靜態類,使用內部類的機制使單例物件延遲載入,內部類相當是外部類的靜態部分,
 * 所以通過jvm來保證執行緒安全
 */
class Singleton3{
    private static class SingletonHolder{
            private static Singleton3 instance = new Singleton3();
    }
    private Singleton3(){}
    public static Singleton3 getInstance(){
        return SingletonHolder.instance;
    }
}

/**
 * 單因素的列舉類,已經實現了單例
 */
enum Singleton4{
    sinleton;
}