zoukankan      html  css  js  c++  java
  • [设计模式]第一回:单例模式(Singleton Pattern)

    1.引言

    设计模式的文章,园子里很多,本人也只是在看文章,把自己的理解写下来,已加深映像。

    Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点。这也是一种功能的实现,比如缓存Cache,虽说有很多访问点,但是它们其实都访问的是同一个实例。

    Singleton模式是用于控制创建对象,所以是一种创建型模式。

    2.实战

    物理模型:

    实现实例唯一,很快就想到了静态变量。static变量,如果类中没有静态构造函数,该变量将在编译时就被添加到加载堆loader heap中,如果有静态构造函数,将在第一次访问类时进行初始化,初始化完成之后,就一直在loader heap中,将不会消失,是分配的这个地址不会消失,如果它指向一个对象,这个对象必然不会回收了。

        public sealed class Singleton
        {
            static Singleton instance = null;
        }

    看到上面的是sealed防止继承,如果不用静态成员,将是不安全的,因为我们无法获取一个对象的引用有多少个。我们还要保证,只实例化一次,因为等号右边的值是会变化的,如下

    instance =new Singleton();
    instance =null;
    instance =new Singleton();

    上面的代码instance 变化了3个值,那是不允许的,好吧,我把构造函数给 私有化,OK防止new了,那null 怎么办,设置成只读,如属性有只读属性。如下:

        public sealed class Singleton
        {
            static Singleton instance = null;       
    
            Singleton()
            {
            }
    
            public static Singleton Instance
            {
                get
                {
                    if (instance == null)
                    {
                        instance = new Singleton();
                    }
                    return instance;
                }
            }
        }

    这个 线程安全问题,多线程 可能会创建多个实例,最终 都会指向最后那个创建的对象,加锁吧。

        public sealed class Singleton
        {
            static Singleton instance = null;
            static readonly object padlock = new object();
    
            Singleton()
            {
            }
    
            public static Singleton Instance
            {
                get
                {
                    if (instance == null)
                    {
                        lock (padlock)
                        {
                            if (instance == null)
                            {
                                instance = new Singleton();
                            }
                        }
                    }
                    return instance;
                }
            }
        }

    现在安全了,其实一个静态变量并且初始化就能达到目的,因为静态变量在内存中只有一份,它的值可以改变的,为了防止改变 只读,用readonly 修饰,不只读不行, 如下:

        public sealed class Singleton
        {
            public readonly static Singleton instance = new Singleton();
        }

    上面方式可以不加sealed。

    3.小结

    实现就是用静态成员 加上 构造器的限制来进行创建,看似简单,要理解这个单例模式,这里涉及到对 继承、构造函数、sealed、readonly、static、lock 关键字的理解,单例模式体现的知识点还不少吧,这些没有理解清楚,就不能很好的实现单例模式。

    作者:Qlin
    出处:http://www.cnblogs.com/qqlin/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    法院
    Spring Cloud常用组件
    PowerShell使用教程
    浅谈3DES加密解密
    SC win consul
    SB-Token-Jwt
    前端MVC Vue2学习总结
    spring-session-data-redis
    SpringBoot WS
    SpringBoot之使用Spring Session集群-redis
  • 原文地址:https://www.cnblogs.com/qqlin/p/2850860.html
Copyright © 2011-2022 走看看