设计模式- 单例模式

  • 单例模式:
    保证一个类仅有一个实例,并提供一个访问它的全局访问点。
    为了解决两个问题:
    • 全局访问
    • 初始化控制
//简单单例
class Singleton
{
    private static Singleton instance;
    private Singleton()
    {
    }
    public static Singleton GetInstance()
    {
        if (instance == null)
        {
            instance = new Singleton();
        }
        return instance;
    }
}
//客户端代码
static void Main(string[] args)
{   
    Singleton s1 = Singleton.GetInstance();
    Singleton s2 = Singleton.GetInstance();
    if(s1 == s2){
        Console.WriteLine("两个对象是相同的实例");
    }
    Console.Read();
}
  • 多线程单例
    当多个线程同时访问 Singleton 类的时候,会有可能创建出多个实例。这时就需要一把 lock 来确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,那么它将一直等待,直到该对象被释放。
//多线程单例
 class Singleton
 {
    private static Singleton instance;
    private static readonly object syncRoot = new object();
    private Singleton()
    {

    }
    //这样做的缺点就是 每次创建的时候都需要 lock。
    // public static Singleton GetInstance()
    // {
    //  lock(syncRoot)
    //  {
    //      if(instance == null)
    //      {
    //          instance = new Singleton();
    //      }
    //  }
    //  return instance;
    // }
    //先判断实例是否存在,不存在再加锁处理
    public static Singleton GetInstance()
    {
        //判断两次实例是否为null 的道理在于,第一次判断是为了避免频繁加锁
        /*第二次判断是为了防止多线程多次创建实例当多个线程同时访问的时候,会允许一个线程进去,当一个线程创建完对象之后,另一个线程进入如果不判断非空的情况,那么也会出现重复创建的情况。*/
        if(instance == null){
            lock(syncRoot){
                if(instance == null)
                {
                    instance = new Singleton();
                }
            }
        }   
        return instance;
    }
}
  • C# 静态初始化
//这种静态初始化方式是在自己被加载的时候就将自己实例化,上面的在第一次被引用的时候才会将自己实例化,属于懒加载。
public sealed class Singleton
{
    //在第一次引用类的任何成员时创建实例。公共语言运行库负责处理变量初始化
    private static readonly Singleton instance = new Singleton();
    private Singleton(){}
    public static Singleton GetInstance()
    {
        return instance;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 单例模式(Singleton Pattern)是众多设计模式中较为简单的一个,同时它也是面试时经常被提及的问题,如...
    廖少少阅读 605评论 0 1
  • 前言 本文主要参考 那些年,我们一起写过的“单例模式”。 何为单例模式? 顾名思义,单例模式就是保证一个类仅有一个...
    tandeneck阅读 2,546评论 1 8
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,825评论 18 399
  • 在Java设计模式中,单例模式相对来说算是比较简单的一种构建模式。适用的场景在于:对于定义的一个类,在整个应用程序...
    时待吾阅读 253评论 0 0
  • 单例模式 单例模式有以下特点: 单例类只能有一个实例 单例类必须自己创建自己的唯一实例 单例类必须给所有其他对象提...
    Mr_不靠谱_先森阅读 376评论 0 0