前提

使用单例模式需有一下三点:

  • 要有一个自己的私有类型的变量
  • 要有一个私有的构造函数
  • 全局访问点(static)

一、什么是单例模式

保证一个类仅有一个实例,并提供一个访问它的全局访问点。UML如下:

【设计模式】单例模式_单例模式

其中,Singleton类,定义了一个GetInstance操作,允许客户访问它的唯一实例,GetInstance是一个静态方法,主要负责创建自己的唯一实例

1、Singleton类

class Singleton
{
private static Singleton instance;

//构造方法让其private,这就堵死了外界利用new创建此类型实例的可能
private Singleton() { }
public static Singleton GetInstance() //此方法是获得本类实例的唯一全局访问点
{
if (instance==null) //如果实例不存在,则new一个新实例,否则返回已有的实例
{
instance = new Singleton();
}
return instance;
}
}

2、客户端

static void Main(string[]args)
{
Singleton s1 = Singleton.GetInstance();
Singleton s2 = Singleton.GetInstance();

//比较两次实例化后对象的结果是实例相同
if (s1==s2)
{
Console.WriteLine("两个对象是相同的实例");
}
Console.Read();
}

运行上述程序,程序台输出了“两个对象是相同的实例”,这说明Singleton1和Singleton2是相同的实例,也即一个类仅有一个实例。

二、单例模式的应用

1、什么时候使用单例模式

想要控制实例数目,节省系统资源的时候

2、优点

  • 内存中只有一个实例,减少了内存开支
  • 避免了对资源的多重占用

3、缺点

  • 没有抽象层,扩展困难
  • 与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化

4、使用场景

根据业务的需要来决定用不用单例模式

5、注意

  • 单例类只能有一个实例
  • 单例类必须自己创建自己的唯一实例
  • 单例类必须给所有其他对象提供这一实例