zoukankan      html  css  js  c++  java
  • 单例模式 随记

    C#中的单例模式:(取自“大话设计模式-程杰”一书)

    单例模式(Singleton):

    保证一个类仅有一个实例,并提供一个访问他的全局访问点

    通常我们可以让一个全局变量使得与一个对象被访问,但他不能防止你实例化多个对象。一个最好的方法就是,让类自身负责保存他的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。

    例:

    class Singleton
        {
            private static Singleton instance;
            private Singleton()
            { 
                
            }
            public static Singleton GetInstance()
            {
                if (instance == null)
                {
                    instance = new Singleton();
                }
                return instance;
            }
    
            /// <summary>
            /// Client side code
            /// </summary>
            /// <param name="args"></param>
            static void Main(string[] args)
            {
                Singleton s1 = Singleton.GetInstance();
                Singleton s2 = Singleton.GetInstance();
    
                if (s1 == s2)
                {
                    Console.WriteLine(  "They have same instance!");
                }
    
                Console.Read();
            }
        }
    View Code

    执行结果截图:

    单例模式因为Singleton类封装他的唯一实例,这样他可以严格的控制用户怎样访问他以及合适访问他,简单的说就是对唯一实例的受控访问!

    多线程时的单例模式:

    lock涵义:lock是确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果是其他线程试图进入锁定的代码。则他将一直等待(即被阻止),直到该对象被释放。

    例:

    class Singleton
        {
            private static Singleton instance;
            private static readonly object syncRoot = new object();
            private Singleton()
            { 
                
            }
            public static Singleton GetInstance()
            {
                lock (syncRoot)
                {
                    if (instance == null)
                    {
                        instance = new Singleton();
                    }
                }
                return instance;
            }
    
            /// <summary>
            /// Client side code
            /// </summary>
            /// <param name="args"></param>
            static void Main(string[] args)
            {
                Singleton s1 = Singleton.GetInstance();
                Singleton s2 = Singleton.GetInstance();
    
                if (s1 == s2)
                {
                    Console.WriteLine(  "They have same instance!");
                }
    
                Console.Read();
            }
        }
    View Code

    执行结果截图同上
    注意:此多线程时的单例模式使用会影响性能,改良如下“双重锁定”:

    class Singleton
        {
            private static Singleton instance;
            private static readonly object syncRoot = new object();
            private Singleton()
            { 
                
            }
            public static Singleton GetInstance()
            {
                if (instance == null)
                {
                    lock (syncRoot)
                    { 
                        if(instance==null)
                        {
                            instance = new Singleton();
                        }
                    }
                }
                return instance;
            }
    
        }
    View Code

    以上单例模式均为“懒汉式单例类”
    下面为“饿汉式单例类”

    静态初始化“饿汉式单例模式”:

      C#与公共语言运行库也提供了一种“静态初始化”方法,这种方法不需要开发人员显式地编写线程安全代码,即可解决多线程环境下他是不安全的问题。

    例:

    public sealed class Singleton //sealed阻止派生,而派生可能会增加实例
        {
            //在第一次引用类的任何成员时创建实例。公共语言运行库负责处理变量初始化
            private static readonly Singleton instance = new Singleton();
    
            private Singleton() 
            {
                
            }
    
            public static Singleton GetInstance()
            {
                return instance;
            }
    
            static void Main(string[] args)
            {
                Singleton s1 = Singleton.instance;
                Singleton s2 = Singleton.GetInstance();
    
                if (s1 == s2)
                {
                    Console.WriteLine("They have same instance!");
                }
    
                Console.Read();
            }
        }
    View Code

    执行结果截图:

    注意:instance变量标记为readonly,这意味着只能在静态初始化期间或在类构造函数中分配变量。
    由于这种静态初始化的方式是在自己被加载时就将自己实例化,所以被形象的称之为饿汉式单例类,原先的单例模式处理方式是要在第一次被引用时,才会将自己实例化,所以就被称为懒汉式单例类。

    更多知识分享:微笑空间站 

  • 相关阅读:
    SCM基础之系统核心功能
    事件记录与变更请求
    SCM基础之配置管理功能
    SCM基础之好处
    SCM基础之配置管理实施
    善其事 利其器:快速制作SEO索引
    深入浅出之正则表达式(二)
    C# 读写文件方法总结
    C#常用正则式整理
    C#正则表达式类Match和Group类的理解
  • 原文地址:https://www.cnblogs.com/xuyongsky1234/p/4142522.html
Copyright © 2011-2022 走看看