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

    应用场景

    资源管理器

    打印机

  • 相关阅读:
    THUSC2018退役预定
    TAT
    dsu on tree(CF600E Lomsat gelral)
    Bzoj4784: [Zjoi2017]仙人掌
    [APIO2018] Duathlon 铁人两项
    仙人掌基础
    Bzoj3672: [Noi2014]购票
    CF809E Surprise me!
    虚树(Bzoj3611: [Heoi2014]大工程)
    Bzoj3197: [Sdoi2013]assassin
  • 原文地址:https://www.cnblogs.com/muzihai1988/p/3203629.html
Copyright © 2011-2022 走看看