• C# 单例模式代码


    原文地址:http://blog.jobbole.com/101746/

    代码一:

        public sealed class Singleton

        {
            static Singleton instance = null;
     
            public void Show()
            {
                Console.WriteLine(  "instance function");
            }
            private Singleton()
            {
            }
     
            public static Singleton Instance
            {
                get
                {
                    if (instance == null)
                    {
                        instance = new Singleton();
                    }
                    return instance;
                }
            }
        }
    备注:对于线程来说不安全
    代码二:
        public sealed class Singleton
        {
            static Singleton instance = null;
            private static readonly object padlock = new object();
     
            private Singleton()
            {
            }
     
            public static Singleton Instance
            {
                get
                {
                    lock (padlock)
                    {
                        if (instance == null)
                        {
                            instance = new Singleton();
                        }
                    }
     
                    return instance;
                }
            }
        }
    备注:线程安全,但由于lock的范围问题,导致有额外的开销,损失了性能
    代码三:
        public sealed class Singleton
        {
            static Singleton instance = null;
            private static readonly object padlock = new object();
     
            private Singleton()
            {
            }
     
            public static Singleton Instance
            {
                get
                {
                    if (instance == null)
                    {
                        lock (padlock)
                        {
                            if (instance == null)
                            {
                                instance = new Singleton();
                            }
                        }
                    }
                    return instance;
                }
            }
        }
    备注:双重锁定,多线程安全,性能上比代码三好一点
    代码四:
         public sealed class Singleton
        {
            private static readonly Singleton instance = null;
            static Singleton()
            {
                instance = new Singleton();
            }
            private Singleton()
            {
            }
            public static Singleton Instance
            {
                get
                {
                    return instance;
                }
            }
        }
    备注:静态初始化方式,依赖公共语言运行库负责处理变量初始化,公共静态属性为访问实例提供了一个全局访问点,对实例化机制的控制权较少(.NET代为实现),是在 .NET 中实现 Singleton 的首选方法
    代码五:
         public sealed class Singleton
        {
            private Singleton()
            {
            }
            public static Singleton Instance
            {
                get
                {
                    return Nested.instance;
                }
            }
     
            public static void Hello()
            {
            }
     
            private class Nested
            {
                internal static readonly Singleton instance = null;
                static Nested()
                {
                    instance = new Singleton();
                }
            }
        }
    备注:延迟初始化,初始化工作由Nested类的一个静态成员来完成,好处是如果只需要调用Hello()方法时,不会触发实例化Singleton实例
     

    注意事项:
    1、Singleton模式中的实例构造器可以设置为protected以允许子类派生。
    2、Singleton模式一般不要支持ICloneable接口,因为这可能会导致多个对象实例,与Singleton模式的初衷违背。
    3、Singleton模式一般不要支持序列化,因为这也有可能导致多个对象实例,同样与Singleton模式的初衷违背。
    4、Singletom模式只考虑到了对象创建的管理,没有考虑对象销毁的管理。就支持垃圾回收的平台和对象的开销来讲,我们一般没有必要对其销毁进行特殊的管理。

    总结:
    1、Singleton模式是限制而不是改进类的创建。
    2、理解和扩展Singleton模式的核心是“如何控制用户使用new对一个类的构造器的任意调用”。
    3、可以很简单的修改一个Singleton,使它有少数几个实例,这样做是允许的而且是有意义的。

  • 相关阅读:
    MySQL数据表命令
    Linux 系统多台主机之间做SSH免密码登陆
    CentOS7配置NFS网络文件系统
    windows10下安装pygame并验证成功
    Docker中的Dockerfile命令详解FROM RUN COPY ADD ENTRYPOINT...
    Docker中使用多阶段Dockerfile构建容器镜像image(镜像优化)
    CentOS7Linux中Docker容器平台的使用
    linux下文件的压缩与解压缩
    Linux修改系统默认Bash shell为Zsh shell
    CentOSLinux系统中Ansible自动化运维的安装以及利用Ansible部署JDK和Hadoop
  • 原文地址:https://www.cnblogs.com/tlduck/p/5550069.html
Copyright © 2020-2023  润新知