文章出處

單例模式, 顧名思義, 就是共用同一個實體對象. 

對于共用, 首先想到的就是static靜態變量, 那么怎么使用static去實現單例呢.

一、單線程單例模式

由于這個模式的實現還是比較簡單的, 所以直接上代碼.(不推薦使用此方式)

public class A
{
    public int Num { get; set; }

    private static A instance;
        
    private A()
    {
        Num = -1;
    }

    public static A Create()
    {
        if (instance == null)
        {
            instance = new A();
        }
        return instance;
    }
}

私有化構造函數之后, 外部就不能通過new A()的方式來實例化A類. 那么此時, 需要提供一個私有化的靜態變量和一個公有化的靜態方法, 來輔助實現單例模式.

測試代碼如下:

static void Main(string[] args)
{
    //A a = new A(); //error

    A a = A.Create();
    a.Num = 0;
    Console.WriteLine("a.Num = " + a.Num);
    Console.WriteLine("---------------------");
A b
= A.Create(); b.Num = 1; Console.WriteLine("b.Num = " + b.Num); Console.WriteLine("a.Num = " + a.Num); Console.ReadKey(); }

這種方式是最直觀的. 當然, 這里用的是字段和函數結合的方式, 使用屬性的方式, 也是可以的, 不在贅述.

下面介紹另一種方式.

方式二、使用readonly的特性來實現單例模式

public static A Instance { get { return instance; } }

private static readonly A instance = new A();

public int Num { get; set; }

private A()
{
    Num = -1;
}

測試代碼是差不多的, 只不過, 獲取實例的方式變了

A a = A.Instance;
a.Num = 0;
Console.WriteLine("a.Num = " + a.Num);
Console.WriteLine("---------------------");

A b = A.Instance;
b.Num = 1;
Console.WriteLine("b.Num = " + b.Num);
Console.WriteLine("a.Num = " + a.Num);

Console.ReadKey();

結果是一樣的, 就不再貼了.

 

二、多線程單例模式

private static object b = new object();

private static A instance;
public static A Instance
{
    get
    {lock (b)
        {
            if (instance == null)
            {
                instance = new A();
            }
        }
    return instance;
    }
}

 

 三、還有一種延遲實例化 - 用內部來來完成初始化工作

public int Num { get; set; }

private A()
{
    Num = -1;
}

public static A Instance
{
    get { return InClass.Instance; }
}

class InClass
{
    static InClass() { }

    internal static readonly A Instance = new A();
}

參考資料:

Implementing the Singleton Pattern in C#

 


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()