创建型模式---单件模式(Singleton Pattern)
动机(Motivation):
    在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。
    如何绕过常规的构造器,提供一种机制来保证一个类只创建一个实例?
    这应该是类设计者的责任,而不是类使用者的责任。
结构图:
        
意图:
    保证一个类仅有一个实例,并提供一个访问它的全局访问点。
                                ------<<设计模式>>GOF
生活的例子:
          
适用性:
   (1)当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
   (2)当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。

代码实现:
(1)单线程Singleton实现
  

class SingleThread_Singleton
    {
        private static SingleThread_Singleton instance = null;
        private  SingleThread_Singleton(){}
        public static SingleThread_Singleton Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new SingleThread_Singleton();
                }
                return instance;
            }
        }
    }

以上代码在单线程情况下不会出现任何问题。但是在多线程的情况下却不是安全的。
如两个线程同时运行到 if (instance == null)判断是否被实例化,一个线程判断为True后,在进行创建
 instance = new SingleThread_Singleton();之前,另一个线程也判断(instance == null),结果也为True.
这样就就违背了Singleton模式的原则(保证一个类仅有一个实例)。
怎样在多线程情况下实现Singleton?
(2)多线程Singleton实现:

1    class MultiThread_Singleton
 2     {
 3       private  static volatile MultiThread_Singleton instance = null;
 4       private static object lockHelper = new object();
 5       private MultiThread_Singleton() { }
 6       public static MultiThread_Singleton Instance
 7       {
 8           get
 9           {
10               if (instance == null)
11               {
12                   lock (lockHelper)
13                   {
14                       if (instance == null)
15                       {
16                           instance = new MultiThread_Singleton();
17                       }
18                   }
19               }
20               return instance;
21           }         
22       }
23

此程序对多线程是安全的,使用了一个辅助对象lockHelper,保证只有一个线程创建实例(如果instance为空,保证只有一个线程instance = new MultiThread_Singleton();创建唯一的一个实例)。(Double Check)
请注意一个关键字volatile,如果去掉这个关键字,还是有可能发生线程不是安全的。
volatile 保证严格意义的多线程编译器在代码编译时对指令不进行微调。
(3)静态Singleton实现

3         class Static_Singleton
4         {
5             public static readonly Static_Singleton instance = new Static_Singleton();
6             private Static_Singleton() { }
7         }

以上代码展开等同于

1     class Static_Singleton
2         {
3             public static readonly Static_Singleton instance;
4             static Static_Singleton()
5             {
6                 instance = new Static_Singleton();
7             }
8             private Static_Singleton() { }
9         }

由此可以看出,完全符合Singleton的原则。
优点: 简洁,易懂
缺点: 不可以实现带参数实例的创建。
(注:以上代码及信息借鉴于李建忠老师的MSDN和TerryLee的文章。)

11单件模式(Singleton Pattern)相关推荐

  1. 单件模式Singleton Pattern

    单件模式:确保一个类只有一个实例,并提供一个全局访问点. 一般思路: 问题: 当为多线程时,可能会创建两个或多个实例,如: 解决方案一:同步,但会降低性能 方法二:使用"急切"创建 ...

  2. 单件模式 Single Pattern HeadFirst学习系列

    单件模式 Single Pattern 独一无二的对象 定义:单件模式确保程序中一个类最多只有一个实例,并提供全局访问.  实现单件模式需要私有的构造器.一个静态方法和一个静态变量.  确定在性能和资 ...

  3. 如何让孩子爱上设计模式 ——11.外观模式(Facade Pattern)

    如何让孩子爱上设计模式 --11.外观模式(Facade Pattern) 标签: 设计模式初涉 场景引入 相信各位玩过LOL英雄联盟游戏的童鞋,对下面两个英雄都不会陌生吧:       分别是瑞雯和 ...

  4. 设计模式学习之单件模式singleton

    定义 单件模式是一种用于确保整个应用程序中只有一个类实例且这个实例所占资源在整个应用程序中是共享的程序设计方法(根据实际情况,可能需要几个类实例).在某些情况下,这种程序设计方法是很有用处的. 单件模 ...

  5. 魔兽争霸之PHP设计模式-单件模式[Singleton]

    前言:我写的关于设计模式的一系列文章.这系列的文章主要针对没接触过设计模式的,或者说接触过但还不是很明白的PHPer. 问题的提出: 可能很多人都写过类,文件操作的,数据库的-- 对于数据库的类来说有 ...

  6. C++设计模式——单件模式(singleton pattern)

    一.原理讲解 由于单件模式也称为单例模式,分为懒汉式单例模式和饿汉式单例模式,两者主要区别是类对象的返回是在编译时创建?还是调用时才创建?其中,懒汉式单例模式是在程序调用时才创建,而饿汉式单例模式是在 ...

  7. 7.1 模板方法模式 (Template Pattern)

    零. 行为型模式概述 1.定义 行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个独个对象都无法单独完成的任务,它涉及算法与对象间职责的分配.行为型模式分为类 ...

  8. 单件模式(Singleton Pattern)

    单件模式(Singleton Pattern) 概述 Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点.这就提出了一个问题:如何绕过常规的构造器,提供一种机制来保证一个类只 ...

  9. .NET设计模式(2):单件模式(Singleton Pattern)

    转载:http://terrylee.cnblogs.com/archive/2005/12/09/293509.html 单件模式(Singleton Pattern) --.NET设计模式系列之二 ...

最新文章

  1. Python 生成器总结
  2. 智能车竞赛技术报告 | 专科基础组 - 沈阳职业技术学院 - 秋名山菜鸟队
  3. Visual Studio 2017最新版正式发布!适用于任何开发人员、平台及APP丨附下载
  4. python turtle应用实例_turtle库应用实例2-六芒星的绘制
  5. 2.AsyncQueryHandler、内容提供者
  6. php中什么是时间戳,php中的时间戳转换函数是什么
  7. Python入门--while循环
  8. Kaggle数据增强攻略来了!不氪金实现50种语言互译
  9. 华为u8825d解锁工具_黔隆科技刷机教程VIVOY55L.PD1613忘记密码刷机解锁降级救砖解屏幕锁账户锁教程...
  10. 韩国服务器性能排行榜,2019韩国云服务器排名
  11. 【异常检测】【SPADE】论文简单梳理与代码实现
  12. 干货!从AI应用的五大要素看,AI产业存在哪些机会?(算力算法)
  13. 18秋计算机应用基础在线作业3,电子科大18秋《计算机应用基础(本科)》在线作业3...
  14. 请帮我写一封情书,500字左右
  15. android 仿微信视频压缩上传,iOS视频压缩(仿微信录像)
  16. (10.2.3.3)静电的设计教室:APP设计利器Sketch教程(03)-让插件助你一臂之力(原创
  17. 二、staticMetaObject’ is not a member of **
  18. Linux:fd_set 结构体定义及使用
  19. 计算机操作系统属于硬件系统吗,操作系统属于计算机的硬件系统吗
  20. JAVA项目中的事务管理

热门文章

  1. noi题库(noi.openjudge.cn) 1.8编程基础之多维数组T21——T25
  2. python的collection系列-默认字典(defaultdict)
  3. 好文推荐系列--------(3)GruntJS 在线重载 提升生产率至新境界
  4. JQuery学习记录——DOM的加载
  5. iframe 自适应高度 跨域
  6. [剑指offer][JAVA]面试题第[34]题[二叉树中和为某一值的路径][回溯]
  7. 计算机配置对电子竞技的影响,配置高并不是唯一优点 看看电竞硬件还要啥?...
  8. mysql集群和主从区别_搭建MySQL主从集群,主从复制过程中同步延迟问题
  9. ajax轮询模拟websocket,Ajax轮询和SSE服务器推送数据与websocket模式的区别性学习
  10. zblog php 外部调用,ZBlogPHP调用指定ID文章的代码GetPost()函数