一、单例模式的介绍

单例模式简单说就是掌握系统的至高点,在程序中只实例化一次,这样就是单例模式,在系统比如说你是该系统的登录的第多少人,还有数据库的连接池等地方会使用,单例模式是最简单,最常用的模式之一,面试经常会问答,所以我们在程序考虑什么地方会用到单例模式,单例模式写法有很多种,这里我下面列举2种写法很普遍的写法,然后做个多线程计数的例子大家来理解一下单例模式的用法。

二、单例模式Demo

/// <summary>
    /// 利用C#的特性单例模式
    /// </summary>

public sealed  class SampleSingleton1
    {
        private int m_Counter = 0;
        private SampleSingleton1()
        {
            Console.WriteLine("初始化SampleSingle1");
        }

        public static readonly SampleSingleton1 singleton = new SampleSingleton1();
        /// <summary>
        /// 调用次数计数器
        /// </summary>
        public void Counter()
        {
            m_Counter++;
        }
    }

/// <summary>
    /// 线程安全的单例模式
    /// </summary>
    public  class SampleSingleton2
    {
        private static volatile SampleSingleton2 m_Instance = null;
        private int m_Counter = 0;
        private SampleSingleton2()
        {
            Console.WriteLine("初始化SampleSingleton2.");
        }
        public static SampleSingleton2 Singleton
        {
            get
            {
                if (m_Instance == null)
                {
                    lock (typeof(SampleSingleton2))
                    {
                        if (m_Instance == null)
                        {
                            m_Instance = new SampleSingleton2();
                        }
                    }
                }
                return m_Instance;
            }
        }
        /// <summary>
        /// 调用计数器
        /// </summary>
        public void Couter()
        {
            m_Counter++;
        }
    }

/// <summary>
    /// 测试2种模式的效率和调用的方式
    /// </summary>

DateTime milestone;
            int maxCallTimes= 100000000;

            // 第一次调用SampleSingleton1的Counter方法
            Console.WriteLine("第一次调用SampleSingleton1的Counter方法");
            SampleSingleton1.singleton.Counter();

            // 计算10000次调用的耗费时间
            milestone = DateTime.Now;
            for (int i = 0; i < maxCallTimes; i++)
            {
                SampleSingleton1.singleton.Counter();
            }
            Console.WriteLine(maxCallTimes.ToString() + "次调用执行时间为:" + ((TimeSpan)(DateTime.Now - milestone)).TotalMilliseconds.ToString());
            Console.WriteLine("");

            // 第一次调用SampleSingleton2的Counter方法
            Console.WriteLine("第一次调用SampleSingleton2的Counter方法");
            SampleSingleton2.Singleton.Couter();

            // 计算10000次调用的耗费时间
            milestone = DateTime.Now;
            for (int i = 0; i < maxCallTimes; i++)
            {
                SampleSingleton2.Singleton.Couter();
            }
            Console.WriteLine(maxCallTimes.ToString() + "次调用执行时间为:" + ((TimeSpan)(DateTime.Now - milestone)).TotalMilliseconds.ToString());

            string str = Console.ReadLine();
        }

 三、GitHub的地址

https://github.com/wangtongzhou520/Designpattern

    

23种设计模式--单例模式-Singleton的更多相关文章

  1. GOF 23种设计模式-单例模式

    • 创建型模式: – 单例模式.工厂模式.抽象工厂模式.建造者模式.原型模式. • 结构型模式: – 适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模 式. • 行为型模式: – ...

  2. 23种设计模式 - 对象性能(Singleton - Flyweight享元)

    其他设计模式 23种设计模式(C++) 每一种都有对应理解的相关代码示例 → Git原码 ⌨ 对象性能 面向对象很好地解决了"抽象"的问题,但是必不可免地付出一定的代价.对于通常情 ...

  3. Java开发中的23种设计模式详解

    [放弃了原文访问者模式的Demo,自己写了一个新使用场景的Demo,加上了自己的理解] [源码地址:https://github.com/leon66666/DesignPattern] 一.设计模式 ...

  4. Java开发中的23种设计模式详解(转)

    设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  5. Java开发中的23种设计模式(转)

    设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  6. c#中的23种设计模式

    C# 23种设计模式汇总 创建型模式 工厂方法(Factory Method) 在工厂方法模式中,工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节.工厂方法模式的核 ...

  7. 从追MM谈Java的23种设计模式(转)

    从追MM谈Java的23种设计模式    这个是从某个文章转载过来的.但是忘了原文链接.如果知道的,我追加一下. 1.FACTORY-追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西 ...

  8. java 23种设计模式及具体例子 收藏有时间慢慢看

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代 码可靠性. 毫无疑问,设计模式 ...

  9. JAVA:23种设计模式详解(转)

    设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

随机推荐

  1. 领域驱动和MVVM应用于UWP开发的一些思考

    领域驱动和MVVM应用于UWP开发的一些思考 0x00 起因 有段时间没写博客了,其实最近本来是根据梳理的MSDN上的资料(UWP开发目录整理)有条不紊的进行UWP学习的.学习中有了心得体会或遇到了问 ...

  2. ASP.Net MVC——使用 ITextSharp 完美解决HTML转PDF(中文也可以)

    前言: 最近在做老师交代的一个在线写实验报告的小项目中,有这么个需求:把学生提交的实验报告(HTML形式)直接转成PDF,方便下载和打印. 以前都是直接用rdlc报表实现的,可这次牵扯到图片,并且更为 ...

  3. 多线程同步工具——Lock

    本文原创,转载请注明出处. 参考文章: <"JUC锁"03之 公平锁(一)> <"JUC锁"03之 公平锁(二)> 锁分独占锁与共享锁, ...

  4. 解决IE8下不兼容rgba()的解决办法

    rgba()是css3的新属性,所以IE8及以下浏览器不兼容,这怎么办呢?终于我找到了解决办法. 解决办法 我们先来解释以下rgba rgba: rgba的含义,r代表red,g代表green,b代表 ...

  5. myrocks复制中断问题排查

    背景 mysql可以支持多种不同的存储引擎,innodb由于其高效的读写性能,并且支持事务特性,使得它成为mysql存储引擎的代名词,使用非常广泛.随着SSD逐渐普及,硬件存储成本越来越高,面向写优化 ...

  6. Android NDK debug 方法

    最近又频繁遇到 NDK 的错误,记录一下debug调试的一些经验,以备后续查看 一般来说,在Android Studio中的Monitor中将过滤器的 LOG TAG 设置为 "DEBUG& ...

  7. python-time 模块

    1.时间戳是以秒为单位的浮点小数,时间戳以自1970年1月1日午夜到现在经过了的时间来表示 2.时间模块引入方式:import time 3.返回时间戳 time.time() 4.返回时间元组:ti ...

  8. Java中的进程和线程

     Java中的进程与线程 一:进程与线程 概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是 ...

  9. Ubuntu下利用Mono,Jexus搭建Asp.Net(MVC) Web服务器

    最近在Ubuntu上搭建了Asp.Net的Web服务器,其中遇到很多问题,整理一下思路,以备后用. 搭建环境以及配套软件 Ubuntu: 11.10 Mono:3.0.6 下载地址(http://do ...

  10. mono ios莫名其妙闪退的解决方法

    使用mono进行ios开发也有一年了,一直有个头疼的问题是闪退,而且闪退的时候并没有抛出明确的错误. 前两天在调试一个bug的时候,在序列化的时候又莫名其妙的闪退,后来在一位大神(博客地址)的指导下, ...