zoukankan      html  css  js  c++  java
  • 聊聊如何使用单例模式

    介绍

    单例模式,顾名思义就是只有一个实例,并且她自己负责创建自己的对象,这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。下面我们来看下有哪几种实现方式吧。

    实现方式

    1、使用lock ,保证方法只有一个线程可以进入。

     /// <summary>
        /// 单例类
        /// </summary>
        public class Singleton
        {
            private Singleton()
            {
                long lResult = 0;
                for (int i = 0; i < 100 - 000 - 000; i++)
                {
                    lResult += i;
                }
                Thread.Sleep(2000);
                Console.WriteLine($"{this.GetType().Name}完成构造....");
            }
            private static Singleton Instance = null;
            private static readonly object Singleton_Lock = new object();
            public static Singleton CreateInstance()
            {
                if (Instance == null)
                {
                    lock (Singleton_Lock)//保证方法块儿只有一个线程可以进入
                    {
                        Console.WriteLine("进入lock排队....");
                        Thread.Sleep(1000);
                        if (Instance == null)
                            Instance = new Singleton();
                    }
                }
                return Instance;
            }
    
            public static void DoNothing()
            {
                Console.WriteLine("DoNothing");
            }
    
            public void Show()
            {
                Console.WriteLine($"{this.GetType().Name} Show....");
            }
        }

    2、使用静态构造函数,由CLR调用,在类型第一次被使用前调用,且只调用一次。

     /// <summary>
        /// 单例类
        /// </summary>
        public class SingletonSecond
        {
            private SingletonSecond()
            {
                long lResult = 0;
                for (int i = 0; i < 100 - 000 - 000; i++)
                {
                    lResult += i;
                }
                Thread.Sleep(2000);
                Console.WriteLine($"{this.GetType().Name}完成构造....");
            }
            private static SingletonSecond Instance = null;
            /// <summary>
            /// 静态构造函数,由CLR调用,在类型第一次被使用前调用,且只调用一次!
            /// </summary>
            static SingletonSecond()
            {
                Instance = new SingletonSecond();
            }
            public static SingletonSecond CreateInstance()
            {
                
                return Instance;
            }
    
            public static void DoNothing()
            {
                Console.WriteLine("DoNothing");
            }
    
            public void Show()
            {
                Console.WriteLine($"{this.GetType().Name} Show....");
            }
        }

    3、使用静态字段,由CLR调用,在类型第一次被使用前初始化,且只初始化一次。

     /// <summary>
        /// 单例类
        /// </summary>
        public class SingletonThird
        {
            private SingletonThird()
            {
                long lResult = 0;
                for (int i = 0; i < 100 - 000 - 000; i++)
                {
                    lResult += i;
                }
                Thread.Sleep(2000);
                Console.WriteLine($"{this.GetType().Name}完成构造....");
            }
            /// <summary>
            /// 静态字段,由CLR调用,在类型第一次被使用前初始化,且只初始化一次!
            /// </summary>
            private static SingletonThird Instance = new SingletonThird();
           
            public static SingletonThird CreateInstance()
            {
                
                return Instance;
            }
    
            public static void DoNothing()
            {
                Console.WriteLine("DoNothing");
            }
    
            public int iNum = 0;
            public void Show()
            {
                Console.WriteLine($"{this.GetType().Name} Show..{iNum++}..");
            }
    
            public void Add()
            {
                this.iNum++;
            }
        }

    使用场景

    1、需要生成唯一序列的环境。

    2、需要频繁实例化然后销毁的对象。

    3、创建对象时耗时过多或者耗资源过多,但又经常用到的对象。 

    4、方便资源相互通信的环境。

  • 相关阅读:
    javascript 注意事项汇总
    Object.prototype.toString方法
    PHPStorm使用心得
    JavaScript基于原型链的继承
    PHP重定向的3种方式
    Android应用与开发环境
    PHP时间处理
    cocos2dxna 游戏中如何控制后退键实现目的性跳转
    wp7 独立存储空间在真机和虚拟机测试的时候数据不一样
    c#获取交叉数组的行、列数
  • 原文地址:https://www.cnblogs.com/lyl6796910/p/14387576.html
Copyright © 2011-2022 走看看