温故而知新:设计模式之单件模式(Singleton)

 1 using System;
 2 
 3 namespace Singleton
 4 {
 5     class Program
 6     {
 7         static void Main(string[] args)
 8         {
 9             Singleton s1 = Singleton.Instance;
10             Singleton s2 = Singleton.Instance;
11 
12             Console.WriteLine(object.ReferenceEquals(s1, s2));
13 
14             Console.Read();
15         }
16     }
17 
18 
19 
20     //线程安全的单件写法
21     sealed class Singleton //sealed并非必要,看需求而定
22     {
23         private Singleton() { }//私有构架器的目的是为了防止编译器自动创建默认的公用构架器(从而阻止了用户new类的实例)
24 
25         private static volatile Singleton _instance;//valatile关键字用于声明该代码不会被编译器自动优化,从而更严格的保证了单件的实现
26 
27         private static object _lockHelper = new object();//同步锁辅助对象
28 
29         //定义一个只读实例属性
30         public static Singleton Instance
31         {
32             get
33             {
34                 if (_instance == null) //初次检测,以防止多次创建实例
35                 {
36                     //#1
37                     lock (_lockHelper) //多线程环境下,极有可能多个线程“同时”运行到这里,所以如果不用同步锁,有可能会出现多个线程“同时”创建多个实例
38                     {
39                         if (_instance == null) //二次检查以防止创建多个实例(解释:如果不加此句,假设有二个线程同时进入#1处,第一个线程锁定-->创建实例-->解锁 到达#2处,第二个线程还留在#1处,同样还是会创建第二个实例,换言之:加锁的目的是为了防止多个线程同时创建,让线程强制有先后顺序,然后用二次检查来防止重复创建
40                         {
41                             _instance = new Singleton();
42                         }
43                     }
44                     //#2
45                 }
46                 return _instance;
47             }
48         }
49     }
50 
51 
52     #region  //这是c#语言中特有的优雅实现方式
53     //sealed class Singleton //sealed并非必要,看需求而定
54     //{
55     //    public static readonly Singleton Instance = new Singleton();
56 
57     //    private Singleton() { }
58     //}
59 
60     //上面的代码等同于
61 
62     //sealed class Singleton 
63     //{
64     //    public static readonly Singleton Instance; //因为静态属性初始化后,仍然有可能被赋值修改,所以必须加上readonly以保证单件实例不再被修改的初衷
65 
66     //    static Singleton() //静态构造器,会在静态成员初次访问前被调用,同时编译器会自动给静态构造器加锁/解锁,所以该方法同样适合于多线程(线程安全)
67     //    {
68     //        Instance = new Singleton();
69     //    }
70 
71     //    private Singleton() { }
72     //}
73     #endregion
74 }
75 

 Singleton的精髓在于:对于类的实例个数做了限制,只要领会了这一点,可以应用到很多场景,比如聊天室最多只能让100个人进来,数据库连接实例只能有200个...

时间: 2024-10-01 19:25:48

温故而知新:设计模式之单件模式(Singleton)的相关文章

设计模式之单件模式(Singleton Pattern )

设计 单件模式 Singleton Pattern Singleton 模式,它包含在创造性模式系列中. 创造性模式指示如何以及何时创建对象.Singleton 模式可以保证一个类有且只有一个实例,并提供一个访问它的全局访问点.在程序设计过程中,有很多情况需要确保一个类只能有一个实例.例如,系统中只能有一个窗口管理器.一个打印假脱机,或者一个数据引擎的访问点.PC机中可能有几个串口,但只能有一个COM1实例. 其结构如下: 我们可以定义一个Spooler类,实现Singleton 模式 Publ

单件模式Singleton来控制窗体被重复或多次打开

本文转载:http://blog.csdn.net/a0700746/article/details/4473796 一般在百度搜一下,会出来一下内容,看来很好用.Singleton很方便的一个用处就是控制窗体被多次或重复打开.下面是它的用法. 一般Singleton模式通常有几种形式: public class Singleton { private Singleton(){} //在自己内部定义自己一个实例,是不是很奇怪? //注意这是private 只供内部调用 private stati

设计模式(二)单件模式Singleton(创建型)

SINGLETON(单件)-对象创建型模式        几乎所有面向对象的程序中,总有一些类的对象需要是唯一的,例如,通过数据库句柄到数据库的连接是独占的.您希望在应用程序中共享数据库句柄,因为在保持连接打开或关闭时,它是一种开销.再如大家最经常用的IM,如QQ,在同一台电脑,一个帐号只能有唯一的登录. 1. 问题 怎样确保一个特殊类的实例是独一无二的(它是这个类的唯一实例),并且这个实例易于被访问呢? 2. 解决方案 1)全局变量:一个全局变量使得一个对象可以被访问,但它不能防止你实例化多个

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

概述 Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点.这就提出了一个问题:如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?客户程序在调用某一个类时,它是不会考虑这个类是否只能有一个实例等问题的,所以,这应该是类设计者的责任,而不是类使用者的责任. 从另一个角度来说,Singleton模式其实也是一种职责型模式.因为我们创建了一个对象,这个对象扮演了独一无二的角色,在这个单独的对象实例中,它集中了它所属类的所有权力,同时它也肩负了行使这种权力的职责! 意图

艾伟_转载:.NET设计模式:单件模式(Singleton Pattern)

概述 Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点.这就提出了一个问题:如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?客户程序在调用某一个类时,它是不会考虑这个类是否只能有一个实例等问题的,所以,这应该是类设计者的责任,而不是类使用者的责任. 从另一个角度来说,Singleton模式其实也是一种职责型模式.因为我们创建了一个对象,这个对象扮演了独一无二的角色,在这个单独的对象实例中,它集中了它所属类的所有权力,同时它也肩负了行使这种权力的职责! 意图

PHP设计模式介绍Ⅳ单件模式

  几乎所有面向对象的程序中,总有一两个资源被创建出来,在程序应用中持续被共享使用.例如,这样的一个资源,在一个电子商务程序的数据库连接中使用:这个连接在应用程序启动时初始化,程序于是可以有效的执行;当程序结束时,这个连接最终被断开并销毁.如果是你写的代码,没必要在每时每刻创建一个数据库连接,这样非常低效.已经建立好的连接应该能被你的代码简单重复的使用.这个问题就是,基于以上要求你将如何进行这个数据库连接?(或者连接其它被循环使用的唯一资源,比如一个开放文件或者一个队列.) 问题 你怎样确保一个

JavaScript设计模式之单件模式介绍_javascript技巧

单件模式说明 1. 说明:单件模式,就是静态化的访问中已经实例化的对象,这个对象只能通过一个唯一的入口访问,已经实例或待实例化的对象:面向对象语言如Java, .Net C#这样的服务端动态语言里,能保证类的操作有顺的进行,避免并行操作使数据发生混乱的情况: 2. 单件模式的好处: 1>. 减少 new 的操作,以免加快内存频繁操作,占用内存: 2>. 尽量减少大系统的对象的开销: 3>. 就是上面说的,可以保障某些类型的操作有顺序准确的操作,以免并行处理引起的数据异常现象: 当然上面说

php设计模式总结-单件模式

一.单件模式 英文叫做sington.其他语言中有叫做单例模式,其实都是一样的道理.保证只会出现单个实例,所以是单例.翻译成单件,永远只会产生一件,呵呵. 还有翻译成单元素模式.其实关键是看这个英文比较好.英文是sington,统一是使用这个单词. 单件模式的目的我理解如下: 避免重复创建(实例化)对象,已经有现成的实例就用现成的. 减少资源的浪费(因为创建多个实例,浪费内存,完全没必要),单件模式保证了每时每刻引用的都是同一个实例. 为什么同时创建多个实例会引起逻辑上的错误呢? $obj1$o

.NET简谈设计模式之(单件模式)

我们继续学习设计模式系列文章. 今天要讲的是单件模式,其实单件模式是比较简单的设计模式,在我们日常开发过程中也是经常用到的. 单件模式:单件模式是一种用于确保整个应用程序中只有一个类实例且这个实例所占资源在整个应用程序中是共享时的程序设计方法. 我想如果初学者对一些基本概念能熟练掌握时,其实单件模式是很简单的,就是因为初学者对一些概念还不是很理解,我们先来扫除这些阻挡我们理解的障碍. 大部分的初学者都会搞不清楚"静态对象"与"实例对象"的区别.当然谁都有一个过渡期,