單例模式的概念:
確保一個類只有一個實例,且自動實例化向外提供這個實例。
使用場景:
1.要求生唯一對象的場景
2.需求提供一個共享訪問或者共享數據
3.創建一個對象需要消耗過多資源,如要訪問IO 或數據庫資源
4.需要定義大量的靜態變量和靜態方法的場景 ,如工具類
常見寫法:
傳說中的餓漢:
/**
* 餓漢,
* 線程安全,
*/
public class ESingleton {
//初始化時生成實例
private static ESingleton singleton = new ESingleton();
//必須是私有
private ESingleton(){
}
//對外提供實例的訪問
public static ESingleton getInstance(){
return singleton;
}
}
傳說中的懶漢:
/**
* 懶漢,
* 線程不安全,不適用高併發場景,
*/
public class LSingleton {
private static LSingleton singleton = null;
private LSingleton(){
}
//使用實例時沒有實例化過再初始化
public static LSingleton getInstance(){
if (singleton ==null){
singleton = new LSingleton();
}
return singleton;
}
}
解決 線程不安全問題,可以給 getInstance 方法加上 synchronized 關鍵字。
變種寫法:
public class Dog {
private Dog() {
}
private static class DogHolder {
private static final Dog dog = new Dog();
}
public static Dog getInstance() {
return DogHolder.dog;
}
public static void bark() {
System.out.println("汪汪汪 ");
}
public void eat() {
System.out.println("就是吃");
}
}
定義參考:《設計模式之禪