zoukankan      html  css  js  c++  java
  • 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,使它有少数几个实例,这样做是允许的而且是有意义的。

  • 相关阅读:
    vue实现图片路径传送
    title中添加小图标
    张钊的第一份作业
    张钊的第二份作业
    在Windows Server 2008 R2环境下安装活动目录失败的一个解决方法
    如何把SubVersion的服务程序变为Window后台服务形式
    一个关于静态方法调用的问题。
    WCF配置中遇到的问题:如何把Hostname修改成IP
    删除Visual Studio最近的项目(转载)
    有时候用ifstream或ofstream打开带有中文路径的文件会失败
  • 原文地址:https://www.cnblogs.com/tlduck/p/5550069.html
Copyright © 2011-2022 走看看