• 设计模式


    单例模式介绍

      这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
      这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
      注意:
        1、单例类只能有一个实例。
        2、单例类必须自己创建自己的唯一实例。
        3、单例类必须给所有其他对象提供这一实例。
      优点:
        1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。
        2、避免对资源的多重占用(比如写文件操作)。
      缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
      【Java】注意事项:getInstance() 方法中需要使用同步锁 synchronized (Singleton.class) 防止多线程同时进入造成 instance 被多次实例化。

    C# - 单例模式
     懒汉式
    public class Singleton
    {
        /// <summary>
        /// 构造方法私有化
        /// </summary>
        private Singleton()
        {}
        private static Singleton _singleton = null;
        public static Singleton getInstance()
        {
            if (_singleton == null)
            {
                _singleton = new Singleton();
            }
            return _singleton;
        }
    }
     饿汉式
    public class Singleton
    {
        /// <summary>
        /// 构造方法私有化
        /// </summary>
        private Singleton()
        {}
        private static Singleton _singleton = new Singleton();
        public static Singleton getInstance()
        {
            return _singleton;
        }
    }
    同步锁【防止多线程被重复创建】
    public class Singleton
    {
        private Singleton()
        {}
        private static Singleton _singleton = null;
        private static object Singleton_Lock = new object(); //锁同步
        public static Singleton getInstance()
        {
            if (_singleton == null) //双if + lock
            {
                lock(Singleton_Lock)
                {
                    if (_singleton == null)
                    {
                        _singleton = new Singleton();
                    }
                }
            }
            return _singleton;
        }
    }
     静态变量实现单例模式
    public class Singleton
    {
        private Singleton()
        {}
        private static readonly Singleton _singleton = new Singleton();
        public static Singleton GetInstance
        {
            get
            {
                return _singleton;
            }
        }
    }
    

     是不是觉得很优雅, 利用静态变量去实现单例,  由CLR保证,在程序第一次使用该类之前被调用,而且只调用一次

     PS: 但是他的缺点也很明显, 在程序初始化后, 静态对象就被CLR构造了, 哪怕你没用。

     静态构造函数实现单例模式
    public class Singleton
    {
        private static readonly Singleton _singleton = null;
        static Singleton()
        {
            _singleton = new Singleton();
        }
        public static Singleton GetInstance()
        {
            return _singleton;
        }
    }
    

     静态构造函数:只能有一个,无参数的,程序无法调用 。

     同样是由CLR保证,在程序第一次使用该类之前被调用,而且只调用一次。同静态变量一样, 它会随着程序运行, 就被实例化, 同静态变量一个道理。

     单例模式中的延迟加载

     延迟加载或延迟加载是一种设计模式,或者您可以说这是一个概念,通常用于将对象的初始化延迟到需要时。因此,延迟加载的主要目标是按需加载对象,或者您可以根据需要说出对象。

     作为 .NET Framework 4.0 的一部分引入的惰性关键字为惰性初始化(即按需对象初始化)提供了内置支持。如果要使对象(如 Singleton)以延迟初始化,则只需将对象的类型(单例)传递给lazy 关键字,如下所示。

    public class Singleton
    {
        private Singleton()
        {}
        private static readonly Lazy<Singleton> _singletonLock = new Lazy<Singleton>(() => new Singleton());
        public static Singleton GetInstance
        {
            get
            {
                return _singletonLock.Value;
            }
        }
    }
     Java - 单例模式
     
     
     
     
     
     
     
  • 相关阅读:
    jQuery操作字符串
    jQuery判断复选框是否被选中的3种方式
    19使用推模式和拉模式实现电梯超重报警
    18不使用委托实现能自动侦测车距的智能汽车
    动态创建html元素的几种方法
    17委托异步调用方法
    MVC文件上传09-使用客户端jQuery-File-Upload插件和服务端Backload组件让每个用户有专属文件夹,并在其中创建分类子文件夹
    MVC文件上传08-使用客户端jQuery-File-Upload插件和服务端Backload组件让每个用户有专属文件夹
    MVC文件上传07-使用客户端jQuery-File-Upload插件和服务端Backload组件裁剪上传图片
    MVC文件上传06-使用客户端jQuery-File-Upload插件和服务端Backload组件自定义控制器上传多个文件
  • 原文地址:https://www.cnblogs.com/gygtech/p/14669167.html
Copyright © 2020-2023  润新知