您好,登录后才能下订单哦!
小编给大家分享一下c#怎样实现单例模式,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!
记一下学习单例模式的笔记:
单例就是要保证该类仅有一个实例。实现完全封闭的单例(外部不能new)其实就要两点要求:
全局访问:需要一个该类型的全局静态变量,每次获取实例时都要判断它是否null,不存在new,存在通过一个方法直接返回该值获取实例来保证对象唯一;
实例化控制:new实例不能外部new、造成实例不唯一,需要一个私有构造器禁用共有构造器。
根据new实例的时机,分为饿汉式和懒汉式:
特点:加载时new,一开始全局就存在该唯一实例,每次用到只要获取就行,提前占用系统资源但不存在线程安全问题。代码如下:
public sealed class Singleton
  {
    private static readonly Singleton instance = new Singleton();
    private Singleton() { }
    public static Singleton GetInstance()
    {
      return instance;
    }
  }特点:真正需要用到的时候才实例化,不提前占用资源但多个线程同时用到该实例时,会存在判断静态变量都为null都去new而产生多个实例的情况。有线程安全问题,但可以用双重锁定解决。
单线程懒汉单例代码如下:
public class Singleton
  {
    private static Singleton instance = null;
    private Singleton() { }
    public static Singleton GetInstance()
    {
      if (instance == null)
        instance = new Singleton();
      return instance;
    }
  }多线程懒汉单例代码如下:
public class Singleton
  {
    private static Singleton instance = null;
    private static readonly object obj = new object();
    private Singleton() { }
    public static Singleton GetInstance()
    {
      //双重锁定
      if (instance == null)//只有为null需要实例化处理时才进行加锁,提高性能避免不必要的等待
      {
        lock (obj)
        {
          if (instance == null)//避免其他线程等待锁释放期间有线程已经实例化,从而造成多个实例
            instance = new Singleton();
        }
      }
      return instance;
    }
  }介绍一个有意思的单例-泛型注册式,是对单例的扩展,主要了解它的设计思想。
其实每个类单例模式实现代码都是差不多的:
相同结构和成员(字段、属性、行为等):是否可以考虑进行抽象提取一个公共的调用接口?
成员类型或输入输出具体类型不是固定的:是否可以考虑设计一个适用于不同类型的通用处理方式而不都是Object?这个适用不同类型通用解决就要用到泛型。
实现代码如下(例子使用饿汉式,当然也可以用懒汉式):
public abstract class Singleton<T> where T:class,new()
  {
    private static readonly T instance = new T();
    protected Singleton() { }
    public static T GetSingleton()//获取单例
    {
      return instance;
    }
  }
  public class Person : Singleton<Person> { }可以看到这种单例通过继承的方式,既可以new实例也可以获取单例实例。如果要实现上面的完全封闭(禁用外部new),也可以完全在Person类中写个私有构造器在Singleton<T>类中实例的获取new T()改为反射调用私有构造器的方式实现,总感觉怪怪的。
下面是主程序调用该单例方法:
static void Main(string[] args)
    {
      Person p1 = Person.GetSingleton();
      Person p2 = Singleton<Person>.GetSingleton();
      if (object.ReferenceEquals(p1, p2))
      {
        Console.WriteLine("两个对象是同一实例");
      }
      Console.ReadKey();
    }输出结果:

看完了这篇文章,相信你对“c#怎样实现单例模式”有了一定的了解,如果想了解更多相关知识,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。