單例模式(Singleton Pattern)是 Java 中最簡單的設計模式之一。這種類型的設計模式屬于建立型模式,它提供了一種建立對象的最佳方式。有以下特點:
1、單例類隻能有一個執行個體。
2、單例類必須自己建立自己的唯一執行個體。
3、單例類必須給所有其他對象提供這一執行個體。
餓漢式
就是類一旦加載,就把單例初始化完成,保證getInstance的時候,單例是已經存在的了。
寫法一:(主要)
class Single {
private static Single INSTANCE = new Single(); //自己建立一個私有屬性的對象
private Single() {} //私有化構造方法
public static Single getInstance() { //公有化傳回該對象的靜态方法
return INSTANCE;
}
}
測試類:
class test {
public static void main(String[] args) {
Single s1 = Single.getInstance();
Single s2 = Single.getInstance();
System.out.println(s1 == s2); //輸出true
}
}
1.私有變量INSTANCE,類外不能通路
2.私有化構造方法,類外不能使用new來建立對象
3.公有化傳回該對象的靜态方法,類外擷取這個執行個體對象
寫法二:(不常用)
class Single {
private Single() {} //私有化構造方法
public static final Single INSTANCE = new Single(); //自己建立一個公有屬性的對象(帶有final屬性
}
加上final,使不可被修改
懶漢式
比較懶,隻有當調用getInstance的時候,才回去初始化這個單例。
public class SingletonLH {
private static SingletonLH instance;
private SingletonLH (){}
public static SingletonLH getInstance() {
if (instance == null) {
instance = new SingletonLH();
}
return instance;
}
}
二漢的比較
線程安全方面:
餓漢式天生就是線程安全的,可以直接用于多線程而不會出現問題;
懶漢式本身是非線程安全的,為了實作線程安全可以修改如下:
public class SingletonLHsyn {
private static SingletonLHsyn instance;
private SingletonLHsyn (){}
public static synchronized SingletonLHsyn getInstance() { //即synchronized修飾的同步方法
if (instance == null) {
instance = new SingletonLHsyn();
}
return instance;
}
}
資源加載和性能方面:
餓漢式在類建立的同時就執行個體化一個靜态對象出來,不管之後會不會使用這個單例,都會占據一定的記憶體,但是相應的,在第一次調用時速度也會更快,因為其資源已經初始化完成。
而懶漢式顧名思義,會延遲加載,在第一次使用該單例的時候才會執行個體化對象出來,第一次調用時要做初始化,如果要做的工作比較多,性能上會有些延遲,之後就和餓漢式一樣了。