java基礎之單例模式

來源:互聯網
上載者:User

為什麼需要單例模式:

首先來明確一個問題,那就是在某些情況下,有些對象,我們只需要一個就可以了,

比如,一台電腦上可以連好幾個印表機,但是這個電腦上的列印程式只能有一個,

這裡就可以通過單例模式來避免兩個列印工作同時輸出到印表機中,

即在整個的列印過程中我只有一個列印程式的執行個體。

 

簡單說來,單例模式(也叫單件模式)的作用就是保證在整個應用程式的生命週期中,

任何一個時刻,單例類的執行個體都只存在一個(當然也可以不存在)。

 

Singleton 類(懶漢式)

namespace Singleton
{
    public class Singleton
    {
        //定義一個私人的靜態全域變數來儲存該類的唯一執行個體
        private static Singleton singleton;

        /// <summary>
        /// 建構函式必須是私人的
        /// 這樣在外部便無法使用 new 來建立該類的執行個體
        /// </summary>
        private Singleton()
        {
        }

       /// <summary>
        /// 定義一個全域訪問點
        /// 設定為靜態方法
        /// 則在類的外部便無需執行個體化就可以調用該方法
        /// </summary>
        /// <returns></returns>
        public static Singleton GetInstance()
        {
            //這裡可以保證只執行個體化一次
            //即在第一次調用時執行個體化
            //以後調用便不會再執行個體化
            if (singleton == null)
            {
                singleton = new Singleton();
            }
            return singleton;
        }
    }
}

測試類別代碼:

 class SingletonTest
{  
        public static void Main(string[] args)
        {
            Singleton.Singleton singletonOne = Singleton.Singleton.GetInstance();
            Singleton.Singleton singletonTwo = Singleton.Singleton.GetInstance();

            if (singletonOne.Equals(singletonTwo))
            {
                Console.WriteLine("singletonOne 和 singletonTwo 代表的是同一個執行個體");
            }
            else
            {
                Console.WriteLine("singletonOne 和 singletonTwo 代表的是不同一個執行個體");
            }

            Console.ReadKey();
        }
    }

從上面的結果可以看出來,儘管我兩次訪問了 GetInstance(),但是我訪問的只是同一個執行個體,

換句話來說,上面的代碼中,由於建構函式被設定為 private 了,

所以您無法再在 Singleton 類的外部使用 new 來執行個體化一個執行個體,您只能通過訪問 GetInstance()來訪問 Singleton 類,

GetInstance()通過如下方式保證該 Singleton 只存在一個執行個體:

首先這個 Singleton 類會在在第一次調用 GetInstance()時建立一個執行個體,並將這個執行個體的引用封裝在自身類中,

然後以後調用 GetInstance()時就會判斷這個 Singleton 是否存在一個執行個體了,如果存在,則不會再建立執行個體。

而是調用以前產生的類的執行個體,這樣下來,整個應用程式中便就只存在一個執行個體了。

從這裡再來總結單例模式的特點:

首先,單例模式使類在程式生命週期的任何時刻都只有一個執行個體,

然後,單例的建構函式是私人的,外部程式如果想要訪問這個單例類的話,

必須通過 GetInstance()來請求(注意是請求)得到這個單例類的執行個體。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.