1. 程式人生 > 實用技巧 >設計模式-單例模式的實現

設計模式-單例模式的實現

單例模式

面試官所認為的單例模式

單例模式(詳解,面試問題)

單例模式的實現方式

  • 餓漢式
  • 懶漢式 執行緒不安全
  • 餓漢式 執行緒安全
  • 雙重檢查 執行緒安全 提高效率
  • 靜態內部類
  • 列舉類

實現程式碼:

package cn.tangg;

/**
 * 餓漢式
 */
public class Singleton {

    private static Singleton instance = new Singleton();

    private Singleton() {}

    static Singleton getInstance() {
        return instance;
    }

}


/**
 * 懶漢式 執行緒不安全
 */
class Singleton2 {
    private static Singleton2 instance;

    private Singleton2(){}

    static Singleton2 getInstance() {
        if (instance == null) {
            instance = new Singleton2();
        }
        return instance;
    }
}

/**
 * 懶漢式 執行緒安全
 * 加類鎖
 */

class Singleton3{

    private static Singleton3 instance;

    private Singleton3(){}

    public static synchronized Singleton3 getInstance() {
        if (instance == null) {
            instance = new Singleton3();
        }
        return instance;
    }
}

/**
 * 雙重檢查加鎖
 */

class Singleton4{
    private static volatile Singleton4 instance;

    private Singleton4(){}

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


/**
 * 靜態內部類
 * 靜態內部類會在第一次被使用的時候被初始化,並且也只會被初始化一次,所以也包含懶載入和執行緒安全的特性。
 */

class Singleton5{
    private Singleton5(){}

    public static Singleton5 getInstance() {
        return SingletonHolder.instance;
    }

    public static class SingletonHolder{
        public static final Singleton5 instance = new Singleton5();
    }
}

/**
 * 列舉單例
 */
enum Singleton6 {
    INSTANCE;
    private String name = "Hello World!";
    
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}