單例模式——Java代碼實現,C#實際使用展現(創建型)

        在設計模式中,單例模式可以說是最簡單的一種了,主要作用是讓一個類自己進行對象的創建,而且保證了只有一個對象被創建,適用於那種全局的對象。就相當於創建對象的時候不用再進行new操作了,當然,排除使用一些框架幫我們創建對象時也不使用new。

        下面直接說一下幾種單例模式。

        懶漢式線程不安全單例:

        所謂懶漢,就是指當調用的時候纔去進行對象的創建,比較節約內存,但這種不好之處就是不支持多線程。

public class Singleton{  
    private static Singleton instance;  
    private Singleton() {

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

        懶漢式線程安全單例:

        所謂的線程安全就是加個鎖,synchronized,一般來說加鎖會影響效率,但是因爲我們使用的單例,一般來說使用的不是很頻繁,所以影響也不大。

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

        餓漢式單例:

        所謂餓漢式單例指的就是在類初始化的時候就建立對象,而不是等調用的時候才創建,這種不用加鎖,能提高效率,因爲是基於類加載的機制,所以不用加鎖就可以實現線程安全。但是這種不好之處就是浪費內存,無法實現懶加載,但有一點需要注意,就是有可能類裏面還存在其它方法能使類進行加載。

public class Singleton {  
    private static Singleton instance = new Singleton();  
    private Singleton (){
    }  
    public static Singleton getInstance() {  
        return instance;  
    }  
}

        雙重校驗鎖:

        這種方式能夠實現懶加載,並且效率高,而且能實現多線程。

public class Singleton {  
    private volatile static Singleton singleton;  
    private Singleton (){
    }  
    public static Singleton getSingleton() {  
        if (singleton == null) {  
            synchronized (Singleton.class) {  
                if (singleton == null) {  
                    singleton = new Singleton();  
                }  
            }  
        }  
    return singleton;  
    }  
}

         靜態內部類式:

         這種方式主要就是應用了靜態內部類,實現了雙重校驗鎖的機制,也是利用了類加載的機制,但不同於第三個餓漢式的是這裏類被加載了,但是INSTANCE並沒有被創建,因爲需要顯示的調用getInstance方法纔會使用靜態內部類SingletonInner,此時對象纔會被創建。並且這種方式還能實現懶加載的機制。

public class Singleton {  
    private static class SingletonInner {  
        private static final Singleton INSTANCE= new Singleton();  
    }  
    private Singleton (){
    }  
    public static final Singleton getInstance() {  
        return SingletonInner.INSTANCE;  
    }  
}

        其實在說了這幾種後,也緊緊停留在理論上,那麼項目中這麼使用呢?博主結合一下最近開發時遇到的一個問題用C#來講解一下。

         我這裏有一個主窗口,然後其中有一個SQL管理的按鈕,點擊之後,會彈出一個新的窗口,裏面進行SQL管理,然後點擊SQL管理裏面的語句時,觸發單擊事件,將SQL語句給傳回到主窗口中的textBox1中進行展示。可能有人想說使用一個變量來接收吧,但這裏還有一個問題,就是那個SQL管理是個dll文件,我是調用的別人開發的SQL管理dll,所以導致這裏要傳回到我的主界面,只能進行new對象操作,但是new對象的話,sql語句就無法傳進我的主窗口了,只能傳到新new的窗口裏面,因此這裏採用單例模式非常合適不過了。

         因此我主窗口使用了單例模式,因爲我這裏對於延遲加載、多線程目前沒啥要求,因此我用哪個方式的單例都可以,我這裏用的第三個方式,其餘的代碼我就不展示了,主要展示一下怎麼在項目中使用的。

public partial class MainView : Form
{
    private static MainView mainView = new MainView();

    private MainView()
    {
        InitializeComponent();
    }

    public static MainView GetInstance()
    {
        return mainView;
    }
}

         至於選擇哪一個單例模式來使用,還是看具體需求,一般來說,不怎麼使用第一個第二個,建議直接使用第三個,然後如果需要實現懶加載,可以使用靜態內部類的方式,對線程要求高,可以使用雙重校驗鎖的方式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章