天天看點

單例模式(餓漢式/懶漢式)

單例模式(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;
    }
}
           

資源加載和性能方面:

餓漢式在類建立的同時就執行個體化一個靜态對象出來,不管之後會不會使用這個單例,都會占據一定的記憶體,但是相應的,在第一次調用時速度也會更快,因為其資源已經初始化完成。

而懶漢式顧名思義,會延遲加載,在第一次使用該單例的時候才會執行個體化對象出來,第一次調用時要做初始化,如果要做的工作比較多,性能上會有些延遲,之後就和餓漢式一樣了。