单例模式 Singleton

模式释义

Ensure a class only has one instance, and provide a global point of access to.

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

模式要点

1. 一个类只有一个实例;

2. 必须自行创建实例;

3. 自行向整个系统提供实例

模式实现要点

1. 单例模式的类只提供私有的构造函数;

2. 类定义含有类的静态私有对象;

3. 提供一个静态的共有函数创建或获取本身的静态私有对象;

实现方式

image

  • 经典模式:
    class Singleton
    {
        private static Singleton instance;

        //构造方法设为private,防止外界new创建实例
        private Singleton()
        {
        }

        //获取本类实例的唯一全局访问点
        public static Singleton Getinstance()
        {
            //若实例不存在,则new一个新的实例,否则返回已有实例
            if (instance == null)
            {
                instance = new Singleton();
            }
            return instance;
        }
    }

调用方法:

Singleton singleton = Singleton.Getinstance();
  • 多线程下的单例模式
  • 双锁模式(Double-Check Locking):(懒汉式单例类)

            第一次引用时,才会将自己实例化

    class Singleton
    {
        private static Singleton instance;
        private static readonly object _syncRoot = new object();

        //构造方法设为private,防止外界new创建实例
        private Singleton()
        {
        }

        //获取本类实例的唯一全局访问点
        public static Singleton Getinstance()
        {
            //先判断实例是否存在,不存在再加锁处理
            if (instance == null)
            {
                //lock确保当一个线程位于代码的临界区时,另一个线程不进入临界区
                //其他线程试图进入锁定的代码,它将一直等待
                lock (_syncRoot)
                {
                    //若实例不存在,则new一个新的实例,否则返回已有实例
                    if (instance == null)
                    {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }
  • 静态初始化(饿汉式单例类):

              在自己加载时将自己实例化

   //sealed:阻止发生派生,派生可能会增加实例
    public sealed class Singleton
    {
        //readonly第一次引用类的任何成员时创建实例;
        //公共语言运行库复测处理变量初始化
        private static readonly Singleton instance = new Singleton();

        private Singleton()
        {
        }

        public static Singleton Getinstance()
        {
            return instance;
        }
    }

单例模式优点

1. 实例控制:阻止其他对象实例化其自己单例对象的副本,从而保证所有对象都访问唯一实例;

2. 灵活性

单例模式缺点

1. 开销:每次请求时都需要检查是否存在类的实例。用静态初始化解决此问题。

2. 可能的开发混淆:开发时不能用new关键字实例化对象。

3. 对象生命周期:不能解决删除单个对象的问题。

应用场景

资源管理器

打印机

原文地址:https://www.cnblogs.com/muzihai1988/p/3203629.html