首页 > 代码库 > 设计模式 - 单例模式

设计模式 - 单例模式

单例模式, 顾名思义, 就是共用同一个实体对象. 

对于共用, 首先想到的就是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#

 

设计模式 - 单例模式