设计模式 - 单例模式
单例模式, 顾名思义, 就是共用同一个实体对象.
对于共用, 首先想到的就是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#