zoukankan      html  css  js  c++  java
  • 单例模式的三种写法

        单例模式是23设计中创建模式的第一个,也是入门的设计模式,好多net 程序员 工作7-8 你让他写3-4个设计模式,我敢说,很多人可能都写不出来,因为net 封装的太厉害了,很多程序员有种惰性,总是"约定俗成" 我就这么用的。C# 语言是一款优秀的语言,并不比java差,只是java 开源早,生态环境好。好了不废话了。直接上三中写法。

       经典写法,双if +lock ,第一个if 判断是为了节省资源,第二个判断是否已经创建对象。。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace DesgersClass
    {
        public class singleton
        {
            private static object _lock=new object();  
            private static  singleton singletons;
    
            public int m = 0;
            public int add()
            { 
             return m++;
            }
            private singleton()
            {
                    
            }
            public static singleton CreateIntance()
            {
                if (singletons == null)
                {
                    lock (_lock)//双if +lock
                    {
                        if (singletons == null)
                        {
                            singletons = new singleton();
                        }
                    }
                }
                return singletons;
            }
    
        }
    }

    客户端调用时 我们不难看出虽然我们循环100次 但是 全局就一个对象,所以a是累加的。

    using DesgersClass;
    using System;
    
    namespace Desgionser23
    {
        internal class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Hello World!");
    
                singleton singleton= singleton.CreateIntance();
                var a = 0;
                for (int i = 0; i < 100; i++) {
                 a=   singleton.add();
                    Console.WriteLine($"*******************************************");
                    Console.WriteLine($"a={a}");
                }
    
                Console.WriteLine();
            }
        }
    }

     

    第二种和第三种 基本套路是一样的,都是利用底层clr 保证静态字段和静态构造函数只创建一次

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace DesgersClass
    {
        public class singletonstaticProp
        {
    
            private static singletonstaticProp singletonstaticProps = new singletonstaticProp();
            public static singletonstaticProp CreateInstance()
            {
                return singletonstaticProps;
            }
    
        }
    }

    *********************

    第三种

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace DesgersClass
    {
        public class singletonstatic
        {
            private static singletonstatic singletonstatics;
    
            static singletonstatic()
            {
                singletonstatics = new singletonstatic();
            }
    
            public static singletonstatic CreateInstance()
            {
                return singletonstatics;
            }
    
        }
    }
  • 相关阅读:
    Objective-C-使用NSMutableURLRequest发送POST请求,使用NSJSONSerialization解析JSON字符串
    js showModalDialog打开新的页面给原页面传值问题
    svn2git使用小记
    模拟等待事件row lock waits
    URAL 1994 The Emperor's plan 求组合数 大数用log+exp处理
    struts总结
    URAL 1992 CVS 链表
    android游戏物理引擎开发——粒子系统(三)
    状态模式与上机
    OpenCV——凸包
  • 原文地址:https://www.cnblogs.com/jasontarry/p/15450252.html
Copyright © 2011-2022 走看看