天天看點

設計模式學習筆記--單例模式

一.面向對象的設計原則

1.單一職責原則: 系統中每個對象隻有一個單獨的職責,對外提供一種功能,引起類變化的原因隻有一個。

2.開閉原則:即對修改關閉,對擴充開放。要更改時是通過增加代碼進行的,而不是改動現在的代碼,否則會産生不可預知的後果。

3.依賴注入原則:要依賴于抽象,不要依賴于具體的實作,如果有類調用其他的類,就應該調用類的接口或者抽象類,而不是直接調用實作類。

4.裡氏替換原則:任何抽象類出現的地方都可以用實作類來替換。

5.迪米特原則:一個對象應當對其他對象盡可能少的了解,降低耦合度。

6.接口分離原則:一個接口應該隻提供一種對外功能。

7.優先使用組合而不是繼承:繼承會導緻級聯變化,較難修改。

二.單例模式

當一個對象在整個程式中隻有一個的時候,每次獲得該對象,應該獲得都是同一個對象,這時候就應該用單例模式。

有兩種,一種是餓漢式,餓得等不及了,一開始就建立了一個對象。

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 設計模式Demo
{

    class Singleton
    {
        static Singleton singleton = new Singleton();
        public static Singleton GetSingleton()
        {
            return singleton;
        }
        public void Show()
        {
            Console.WriteLine("hehe!");
        }
        //構造函數私有化
        private Singleton()
        { }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Singleton.GetSingleton().Show();
            Console.ReadLine();
        }
       
    }

    
}
           

另一種是懶漢式,先偷會兒懶,等到用的時候才建立:

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 設計模式Demo
{

    class Singleton
    {
        static Singleton singleton = null;
        public static Singleton GetSingleton()
        {
            if (singleton == null)
                singleton = new Singleton();
            return singleton;
        }
        public void Show()
        {
            Console.WriteLine("hehe!");
        }
        //構造函數私有化
        private Singleton()
        { }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Singleton.GetSingleton().Show();
            Console.ReadLine();
        }
       
    }

    
}
           

注意,在懶漢式中,如果有多線程,有可能會出現問題。即判斷singleton==null之後,有可能發生CPU輪換。這裡我們可以加上同步的一些函數,來防止出現這種情況。或者直接采用餓漢式。

單例模式經常在檔案管理,資料庫連接配接池等中使用。

繼續閱讀