旧游无处不堪寻
无寻处,惟有少年心
设计模式-单例

单例模式(Singleton Pattern)是一种创建型设计模式,让你能够保证一个类只有一个实例,并提供一个访问该实例的全局节点。

解释


单例模式同时解决了两个问题,但违反了单一职责原则:

  1. 保证一个类只有一个实例
  2. 为该实例提供一个全局访问节点

所有单例的实现都包含以下两个相同的步骤:

  1. 将默认构造函数设为私有,防止其他对象使用单例类的 new 运算符
  2. 新建一个静态构建方法作为构造函数

单例模式 UML


适用场景


  1. 如果程序中的某个类对于所有客户端只有一个可用的实例,可以使用单例模式
  2. 如果你需要更加严格地控制全局变量,可以使用单例模式

代码示例


using System;
namespace SingletonPatternDemo
{
sealed class Singleton
{
private Singleton() { }

private static Singleton _instance;

private static readonly object _lock = new object();

public static Singleton GetInstance(string value)
{
if (_instance == null)
{
lock (_lock)
{
if (_instance == null)
{
_instance = new Singleton();
_instance.Value = value;
}
}
}
return _instance;
}

public string Value { get; set; }
}

class Program
{
static void Main(string[] args)
{
Console.WriteLine(
"{0}\n{1}\n\n{2}\n",
"If you see the same value, then singleton was reused (yay!)",
"If you see different values, then 2 singletons were created (booo!!)",
"RESULT:"
);

Thread process1 = new Thread(() =>
{
TestSingleton("FOO");
});
Thread process2 = new Thread(() =>
{
TestSingleton("BAR");
});

process1.Start();
process2.Start();

process1.Join();
process2.Join();
// output

// FOO
// FOO
}

public static void TestSingleton(string value)
{
Singleton singleton = Singleton.GetInstance(value);
Console.WriteLine(singleton.Value);
}
}
}