• 单例模式 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. 对象生命周期:不能解决删除单个对象的问题。

    应用场景

    资源管理器

    打印机

  • 相关阅读:
    server正式的环境性能测试nginx-php 指着寻求突破的表现
    SICP 锻炼 (1.45)解决摘要
    sdut 3-4 长方形的周长和面积计算
    吉克1111-1114第七周讲座班、家庭作业(动态规划,期限:2014年4月25日本23点-周五晚上,科委飞信通知学生)
    STL源代码分析——STL算法sort排序算法
    伺服驱动器UVW电机电源线相序错误
    1_BLE nRF51822 UART 与 BLE转发
    研制埃博拉疫苗与科学家的奇思秒想
    垂死挣扎还是涅槃重生 -- Delphi XE5 公布会归来感想
    Recover Binary Search Tree -- LeetCode
  • 原文地址:https://www.cnblogs.com/muzihai1988/p/3203629.html
Copyright © 2020-2023  润新知