c#单例模式(Singleton)的6种实现

2019-12-30 15:36:35王振洲

1.1.1 摘要

 在我们日常的工作中经常需要在应用程序中保持一个唯一的实例,如:IO处理,数据库操作等,由于这些对象都要占用重要的系统资源,所以我们必须限制这些实例的创建或始终使用一个公用的实例,这就是我们今天要介绍的——单例模式(Singleton)。

 使用频率c#,单例模式实现,c#单例模式,c#单例模式应用

单件模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点。

1.1.2 正文

c#,单例模式实现,c#单例模式,c#单例模式应用

图1单例模式(Singleton)结构图

单例模式(Singleton)是几个创建模式中最对立的一个,它的主要特点不是根据用户程序调用生成一个新的实例,而是控制某个类型的实例唯一性,通过上图我们知道它包含的角色只有一个,就是Singleton,它拥有一个私有构造函数,这确保用户无法通过new直接实例它。除此之外,该模式中包含一个静态私有成员变量instance与静态公有方法Instance()。Instance()方法负责检验并实例化自己,然后存储在静态成员变量中,以确保只有一个实例被创建。

c#,单例模式实现,c#单例模式,c#单例模式应用

图2单例模式(Singleton)逻辑模型

接下来我们将介绍6中不同的单例模式(Singleton)的实现方式。这些实现方式都有以下的共同点:

 1.有一个私有的无参构造函数,这可以防止其他类实例化它,而且单例类也不应该被继承,如果单例类允许继承那么每个子类都可以创建实例,这就违背了Singleton模式“唯一实例”的初衷。

2.单例类被定义为sealed,就像前面提到的该类不应该被继承,所以为了保险起见可以把该类定义成不允许派生,但没有要求一定要这样定义。

3.一个静态的变量用来保存单实例的引用。

4.一个公有的静态方法用来获取单实例的引用,如果实例为null即创建一个。

版本一线程不安全


 /// <summary>
/// A simple singleton class implements.
/// </summary>
public sealed class Singleton
{
  private static Singleton _instance = null;

  /// <summary>
  /// Prevents a default instance of the 
  /// <see cref="Singleton"/> class from being created.
  /// </summary>
  private Singleton()
  {
  }

  /// <summary>
  /// Gets the instance.
  /// </summary>
  public static Singleton Instance
  {
    get { return _instance ?? (_instance = new Singleton()); }
  }
}