概述
Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点。那么绕过常规的构造器(new),提供一种机制来保证一个类只有一个实例就是单件模式了。客户程序员在调用这个类时,是不会考虑这个类是否只能有一个实例等问题的,所以,这应该是类设计者的责任,而不是类使用者的责任。
意图
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
模型图
逻辑模型图:

<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1112" style="WIDTH: 327pt; HEIGHT: 80.25pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/images/cnblogs_com/terrylee/PIC025.jpg" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image001.jpg"></imagedata></shape>
物理模型图:

<shape id="_x0000_i1113" style="WIDTH: 299.25pt; HEIGHT: 110.25pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/images/cnblogs_com/terrylee/PIC030.JPG" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image002.jpg"></imagedata></shape>
生活中的例子
微软的CEO是Singleton,微软只有一个CEO,所以无论他的身份为何,他都有一个全局的访问点---“微软的CEO”。
五种实现
1.简单实现
publicsealedclassSingleton
<shape id="_x0000_i1114" style="WIDTH: 11.25pt; HEIGHT: 15pt" alt="" type="#_x0000_t75"><imagedata o:href="http://www.cnblogs.com/Images/dot.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image003.gif"></imagedata></shape>{
staticSingletoninstance=null;
Singleton()
<shape id="_x0000_i1115" style="WIDTH: 11.25pt; HEIGHT: 15pt" alt="" type="#_x0000_t75"><imagedata o:href="http://www.cnblogs.com/Images/dot.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image003.gif"></imagedata></shape>{
}
publicstaticSingletonInstance
<shape id="_x0000_i1116" style="WIDTH: 11.25pt; HEIGHT: 15pt" alt="" type="#_x0000_t75"><imagedata o:href="http://www.cnblogs.com/Images/dot.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image003.gif"></imagedata></shape>{
get
<shape id="_x0000_i1117" style="WIDTH: 11.25pt; HEIGHT: 15pt" alt="" type="#_x0000_t75"><imagedata o:href="http://www.cnblogs.com/Images/dot.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image003.gif"></imagedata></shape>{
if(instance==null)
<shape id="_x0000_i1118" style="WIDTH: 11.25pt; HEIGHT: 15pt" alt="" type="#_x0000_t75"><imagedata o:href="http://www.cnblogs.com/Images/dot.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image003.gif"></imagedata></shape>{
instance=newSingleton();
}
returninstance;
}
}
}
这种方式的实现的“CEO”并不是线程安全的,也就是在多线程的情况下他是有可能产生两个“CEO”的。如代码所写,如果同时有两个线程去判断(instance == null),并且得到的结果为真,这时两个线程都会创建类Singleton的实例,这样就违背了Singleton模式的原则。
2.安全的线程
publicsealedclassSingleton
<shape id="_x0000_i1119" style="WIDTH: 11.25pt; HEIGHT: 15pt" alt="" type="#_x0000_t75"><imagedata o:href="http://www.cnblogs.com/Images/dot.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image003.gif"></imagedata></shape>{
staticSingletoninstance=null;
staticreadonlyobjectpadlock=newobject();
Singleton()
<shape id="_x0000_i1120" style="WIDTH: 11.25pt; HEIGHT: 15pt" alt="" type="#_x0000_t75"><imagedata o:href="http://www.cnblogs.com/Images/dot.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image003.gif"></imagedata></shape>{
}
publicstaticSingletonInstance
<shape id="_x0000_i1121" style="WIDTH: 11.25pt; HEIGHT: 15pt" alt="" type="#_x0000_t75"><imagedata o:href="http://www.cnblogs.com/Images/dot.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image003.gif"></imagedata></shape>{
get
<shape id="_x0000_i1122" style="WIDTH: 11.25pt; HEIGHT: 15pt" alt="" type="#_x0000_t75"><imagedata o:href="http://www.cnblogs.com/Images/dot.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image003.gif"></imagedata></shape>{
lock(padlock)
<shape id="_x0000_i1123" style="WIDTH: 11.25pt; HEIGHT: 15pt" alt="" type="#_x0000_t75"><imagedata o:href="http://www.cnblogs.com/Images/dot.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image003.gif"></imagedata></shape>{
if(instance==null)
<shape id="_x0000_i1124" style="WIDTH: 11.25pt; HEIGHT: 15pt" alt="" type="#_x0000_t75"><imagedata o:href="http://www.cnblogs.com/Images/dot.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image003.gif"></imagedata></shape>{
instance=newSingleton();
}
returninstance;
}
}
}
}
这种方式的实现对于线程来说是安全的。我们首先创建了一个进程辅助对象,线程在进入时先对辅助对象加锁然后再检测对象是否被创建,这样可以确保只有一个实例被创建,因为在同一个时刻加了锁的那部分程序只有一个线程可以进入。这种情况下,对象实例由最先进入的那个线程创建,后来的线程在进入时(instence == null)为假,不会再去创建对象实例了。但是这种实现方式增加了额外的开销,损失了性能。
3.双重锁定
1<shape id="_x0000_i1025" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/None.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image004.gif"></imagedata></shape>publicsealedclassSingleton
2<shape id="Codehighlighter1_30_522_Open_Image" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1026"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image005.gif"></imagedata></shape><shape id="Codehighlighter1_30_522_Closed_Image" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1027"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image006.gif"></imagedata></shape><shape id="_x0000_i1125" style="WIDTH: 11.25pt; HEIGHT: 15pt" alt="" type="#_x0000_t75"><imagedata o:href="http://www.cnblogs.com/Images/dot.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image003.gif"></imagedata></shape>{
3<shape id="_x0000_i1028" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image007.gif"></imagedata></shape>staticSingletoninstance=null;
4<shape id="_x0000_i1029" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image007.gif"></imagedata></shape>staticreadonlyobjectpadlock=newobject();
5<shape id="_x0000_i1030" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image007.gif"></imagedata></shape>
6<shape id="_x0000_i1031" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image007.gif"></imagedata></shape>Singleton()
7<shape id="Codehighlighter1_140_146_Open_Image" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1032"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image008.gif"></imagedata></shape><shape id="Codehighlighter1_140_146_Closed_Image" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1033"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image009.gif"></imagedata></shape><shape id="_x0000_i1126" style="WIDTH: 11.25pt; HEIGHT: 15pt" alt="" type="#_x0000_t75"><imagedata o:href="http://www.cnblogs.com/Images/dot.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image003.gif"></imagedata></shape>{
8<shape id="_x0000_i1034" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image010.gif"></imagedata></shape>}
9<shape id="_x0000_i1035" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image007.gif"></imagedata></shape>
10<shape id="_x0000_i1036" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image007.gif"></imagedata></shape>publicstaticSingletonInstance
11<shape id="Codehighlighter1_190_520_Open_Image" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1037"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image008.gif"></imagedata></shape><shape id="Codehighlighter1_190_520_Closed_Image" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1038"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image009.gif"></imagedata></shape><shape id="_x0000_i1127" style="WIDTH: 11.25pt; HEIGHT: 15pt" alt="" type="#_x0000_t75"><imagedata o:href="http://www.cnblogs.com/Images/dot.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image003.gif"></imagedata></shape>{
12<shape id="_x0000_i1039" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image007.gif"></imagedata></shape>get
13<shape id="Codehighlighter1_212_514_Open_Image" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1040"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image008.gif"></imagedata></shape><shape id="Codehighlighter1_212_514_Closed_Image" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1041"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image009.gif"></imagedata></shape><shape id="_x0000_i1128" style="WIDTH: 11.25pt; HEIGHT: 15pt" alt="" type="#_x0000_t75"><imagedata o:href="http://www.cnblogs.com/Images/dot.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image003.gif"></imagedata></shape>{
14<shape id="_x0000_i1042" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image007.gif"></imagedata></shape>if(instance==null)
15<shape id="Codehighlighter1_258_475_Open_Image" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1043"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image008.gif"></imagedata></shape><shape id="Codehighlighter1_258_475_Closed_Image" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1044"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image009.gif"></imagedata></shape><shape id="_x0000_i1129" style="WIDTH: 11.25pt; HEIGHT: 15pt" alt="" type="#_x0000_t75"><imagedata o:href="http://www.cnblogs.com/Images/dot.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image003.gif"></imagedata></shape>{
16<shape id="_x0000_i1045" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image007.gif"></imagedata></shape>lock(padlock)
17<shape id="Codehighlighter1_307_461_Open_Image" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1046"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image008.gif"></imagedata></shape><shape id="Codehighlighter1_307_461_Closed_Image" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1047"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image009.gif"></imagedata></shape><shape id="_x0000_i1130" style="WIDTH: 11.25pt; HEIGHT: 15pt" alt="" type="#_x0000_t75"><imagedata o:href="http://www.cnblogs.com/Images/dot.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image003.gif"></imagedata></shape>{
18<shape id="_x0000_i1048" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image007.gif"></imagedata></shape>if(instance==null)
19<shape id="Codehighlighter1_369_443_Open_Image" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1049"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image008.gif"></imagedata></shape><shape id="Codehighlighter1_369_443_Closed_Image" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1050"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image009.gif"></imagedata></shape><shape id="_x0000_i1131" style="WIDTH: 11.25pt; HEIGHT: 15pt" alt="" type="#_x0000_t75"><imagedata o:href="http://www.cnblogs.com/Images/dot.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image003.gif"></imagedata></shape>{
20<shape id="_x0000_i1051" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image007.gif"></imagedata></shape>instance=newSingleton();
21<shape id="_x0000_i1052" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image010.gif"></imagedata></shape>}
22<shape id="_x0000_i1053" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image010.gif"></imagedata></shape>}
23<shape id="_x0000_i1054" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image010.gif"></imagedata></shape>}
24<shape id="_x0000_i1055" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image007.gif"></imagedata></shape>returninstance;
25<shape id="_x0000_i1056" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image010.gif"></imagedata></shape>}
26<shape id="_x0000_i1057" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image010.gif"></imagedata></shape>}
27<shape id="_x0000_i1058" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image011.gif"></imagedata></shape>}
28<shape id="_x0000_i1059" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/None.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image004.gif"></imagedata></shape>
这种实现方式对多线程来说是安全的,同时线程不是每次都加锁,只有判断对象实例没有被创建时它才加锁,有了我们上面第一部分的里面的分析,我们知道,加锁后还得再进行对象是否已被创建的判断。它解决了线程并发问题,同时避免在每个 Instance 属性方法的调用中都出现独占锁定。它还允许您将实例化延迟到第一次访问对象时发生。实际上,应用程序很少需要这种类型的实现。大多数情况下我们会用静态初始化。这种方式仍然有很多缺点:无法实现延迟初始化。
4.静态初始化
1<shape id="_x0000_i1132" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/None.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image004.gif"></imagedata></shape>publicsealedclassSingleton
2<shape id="Codehighlighter1_30_264_Open_Image" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1133"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image005.gif"></imagedata></shape><shape id="Codehighlighter1_30_264_Closed_Image" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1134"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image006.gif"></imagedata></shape><shape id="_x0000_i1135" style="WIDTH: 11.25pt; HEIGHT: 15pt" alt="" type="#_x0000_t75"><imagedata o:href="http://www.cnblogs.com/Images/dot.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image003.gif"></imagedata></shape>{
3<shape id="_x0000_i1136" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image007.gif"></imagedata></shape>staticreadonlySingletoninstance=newSingleton();
4<shape id="_x0000_i1060" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image007.gif"></imagedata></shape>
5<shape id="_x0000_i1061" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image007.gif"></imagedata></shape>staticSingleton()
6<shape id="Codehighlighter1_116_122_Open_Image" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1062"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image008.gif"></imagedata></shape><shape id="Codehighlighter1_116_122_Closed_Image" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1063"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image009.gif"></imagedata></shape><shape id="_x0000_i1137" style="WIDTH: 11.25pt; HEIGHT: 15pt" alt="" type="#_x0000_t75"><imagedata o:href="http://www.cnblogs.com/Images/dot.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image003.gif"></imagedata></shape>{
7<shape id="_x0000_i1064" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image010.gif"></imagedata></shape>}
8<shape id="_x0000_i1065" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image007.gif"></imagedata></shape>
9<shape id="_x0000_i1066" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image007.gif"></imagedata></shape>Singleton()
10<shape id="Codehighlighter1_145_151_Open_Image" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1067"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image008.gif"></imagedata></shape><shape id="Codehighlighter1_145_151_Closed_Image" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1068"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image009.gif"></imagedata></shape><shape id="_x0000_i1138" style="WIDTH: 11.25pt; HEIGHT: 15pt" alt="" type="#_x0000_t75"><imagedata o:href="http://www.cnblogs.com/Images/dot.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image003.gif"></imagedata></shape>{
11<shape id="_x0000_i1069" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image010.gif"></imagedata></shape>}
12<shape id="_x0000_i1070" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image007.gif"></imagedata></shape>
13<shape id="_x0000_i1071" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image007.gif"></imagedata></shape>publicstaticSingletonInstance
14<shape id="Codehighlighter1_195_262_Open_Image" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1072"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image008.gif"></imagedata></shape><shape id="Codehighlighter1_195_262_Closed_Image" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1073"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image009.gif"></imagedata></shape><shape id="_x0000_i1139" style="WIDTH: 11.25pt; HEIGHT: 15pt" alt="" type="#_x0000_t75"><imagedata o:href="http://www.cnblogs.com/Images/dot.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image003.gif"></imagedata></shape>{
15<shape id="_x0000_i1074" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image007.gif"></imagedata></shape>get
16<shape id="Codehighlighter1_217_256_Open_Image" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1075"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image008.gif"></imagedata></shape><shape id="Codehighlighter1_217_256_Closed_Image" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1076"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image009.gif"></imagedata></shape><shape id="_x0000_i1140" style="WIDTH: 11.25pt; HEIGHT: 15pt" alt="" type="#_x0000_t75"><imagedata o:href="http://www.cnblogs.com/Images/dot.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image003.gif"></imagedata></shape>{
17<shape id="_x0000_i1077" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image007.gif"></imagedata></shape>returninstance;
18<shape id="_x0000_i1078" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image010.gif"></imagedata></shape>}
19<shape id="_x0000_i1079" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image010.gif"></imagedata></shape>}
20<shape id="_x0000_i1080" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image011.gif"></imagedata></shape>}
21<shape id="_x0000_i1081" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/None.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image004.gif"></imagedata></shape>
看到上面这段富有戏剧性的代码,我们可能会产生怀疑,这还是Singleton模式吗?在此实现中,将在第一次引用类的任何成员时创建实例。公共语言运行库负责处理变量初始化。该类标记为 sealed 以阻止发生派生,而派生可能会增加实例。此外,变量标记为 readonly,这意味着只能在静态初始化期间(此处显示的示例)或在类构造函数中分配变量。
该实现与前面的示例类似,不同之处在于它依赖公共语言运行库来初始化变量。它仍然可以用来解决 Singleton 模式试图解决的两个基本问题:全局访问和实例化控制。公共静态属性为访问实例提供了一个全局访问点。此外,由于构造函数是私有的,因此不能在类本身以外实例化 Singleton 类;因此,变量引用的是可以在系统中存在的唯一的实例。
由于 Singleton 实例被私有静态成员变量引用,因此在类首次被对 Instance 属性的调用所引用之前,不会发生实例化。
这种方法唯一的潜在缺点是,您对实例化机制的控制权较少。在 Design Patterns 形式中,您能够在实例化之前使用非默认的构造函数或执行其他任务。由于在此解决方案中由 .NET Framework 负责执行初始化,因此您没有这些选项。在大多数情况下,静态初始化是在 .NET 中实现 Singleton 的首选方法。
5.延迟初始化
1<shape id="_x0000_i1082" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/None.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image004.gif"></imagedata></shape>publicsealedclassSingleton
2<shape id="Codehighlighter1_30_328_Open_Image" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1083"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image005.gif"></imagedata></shape><shape id="Codehighlighter1_30_328_Closed_Image" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1084"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image006.gif"></imagedata></shape><shape id="_x0000_i1141" style="WIDTH: 11.25pt; HEIGHT: 15pt" alt="" type="#_x0000_t75"><imagedata o:href="http://www.cnblogs.com/Images/dot.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image003.gif"></imagedata></shape>{
3<shape id="_x0000_i1085" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image007.gif"></imagedata></shape>Singleton()
4<shape id="Codehighlighter1_52_58_Open_Image" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1086"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image008.gif"></imagedata></shape><shape id="Codehighlighter1_52_58_Closed_Image" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1087"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image009.gif"></imagedata></shape><shape id="_x0000_i1142" style="WIDTH: 11.25pt; HEIGHT: 15pt" alt="" type="#_x0000_t75"><imagedata o:href="http://www.cnblogs.com/Images/dot.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image003.gif"></imagedata></shape>{
5<shape id="_x0000_i1088" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image010.gif"></imagedata></shape>}
6<shape id="_x0000_i1089" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image007.gif"></imagedata></shape>
7<shape id="_x0000_i1090" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image007.gif"></imagedata></shape>publicstaticSingletonInstance
8<shape id="Codehighlighter1_102_176_Open_Image" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1091"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image008.gif"></imagedata></shape><shape id="Codehighlighter1_102_176_Closed_Image" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1092"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image009.gif"></imagedata></shape><shape id="_x0000_i1143" style="WIDTH: 11.25pt; HEIGHT: 15pt" alt="" type="#_x0000_t75"><imagedata o:href="http://www.cnblogs.com/Images/dot.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image003.gif"></imagedata></shape>{
9<shape id="_x0000_i1093" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image007.gif"></imagedata></shape>get
10<shape id="Codehighlighter1_124_170_Open_Image" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1094"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image008.gif"></imagedata></shape><shape id="Codehighlighter1_124_170_Closed_Image" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1095"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image009.gif"></imagedata></shape><shape id="_x0000_i1144" style="WIDTH: 11.25pt; HEIGHT: 15pt" alt="" type="#_x0000_t75"><imagedata o:href="http://www.cnblogs.com/Images/dot.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image003.gif"></imagedata></shape>{
11<shape id="_x0000_i1096" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image007.gif"></imagedata></shape>returnNested.instance;
12<shape id="_x0000_i1097" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image010.gif"></imagedata></shape>}
13<shape id="_x0000_i1098" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image010.gif"></imagedata></shape>}
14<shape id="_x0000_i1099" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image007.gif"></imagedata></shape>
15<shape id="_x0000_i1100" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image007.gif"></imagedata></shape>classNested
16<shape id="Codehighlighter1_204_326_Open_Image" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1101"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image008.gif"></imagedata></shape><shape id="Codehighlighter1_204_326_Closed_Image" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1102"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image009.gif"></imagedata></shape><shape id="_x0000_i1145" style="WIDTH: 11.25pt; HEIGHT: 15pt" alt="" type="#_x0000_t75"><imagedata o:href="http://www.cnblogs.com/Images/dot.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image003.gif"></imagedata></shape>{
17<shape id="_x0000_i1103" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image007.gif"></imagedata></shape>staticNested()
18<shape id="Codehighlighter1_238_248_Open_Image" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1104"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image008.gif"></imagedata></shape><shape id="Codehighlighter1_238_248_Closed_Image" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75" o:spid="_x0000_i1105"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image009.gif"></imagedata></shape><shape id="_x0000_i1146" style="WIDTH: 11.25pt; HEIGHT: 15pt" alt="" type="#_x0000_t75"><imagedata o:href="http://www.cnblogs.com/Images/dot.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image003.gif"></imagedata></shape>{
19<shape id="_x0000_i1106" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image010.gif"></imagedata></shape>}
20<shape id="_x0000_i1107" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image007.gif"></imagedata></shape>
21<shape id="_x0000_i1108" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image007.gif"></imagedata></shape>internalstaticreadonlySingletoninstance=newSingleton();
22<shape id="_x0000_i1109" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image010.gif"></imagedata></shape>}
23<shape id="_x0000_i1110" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image011.gif"></imagedata></shape>}
24<shape id="_x0000_i1111" style="WIDTH: 8.25pt; HEIGHT: 12pt" alt="" type="#_x0000_t75"><imagedata o:href="http://terrylee.cnblogs.com/Images/OutliningIndicators/None.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image004.gif"></imagedata></shape>
这里,初始化工作有Nested类的一个静态成员来完成,这样就实现了延迟初始化,并具有很多的优势,是值得推荐的一种实现方式。
实现要点
l Singleton模式是限制而不是改进类的创建。
l Singleton类中的实例构造器可以设置为Protected以允许子类派生。
l Singleton模式一般不要支持Icloneable接口,因为这可能导致多个对象实例,与Singleton模式的初衷违背。
l Singleton模式一般不要支持序列化,这也有可能导致多个对象实例,这也与Singleton模式的初衷违背。
l Singleton只考虑了对象创建的管理,没有考虑到销毁的管理,就支持垃圾回收的平台和对象的开销来讲,我们一般没必要对其销毁进行特殊的管理。
l 理解和扩展Singleton模式的核心是“如何控制用户使用new对一个类的构造器的任意调用”。
l 可以很简单的修改一个Singleton,使它有少数几个实例,这样做是允许的而且是有意义的。
优点
l 实例控制:Singleton 会阻止其他对象实例化其自己的 Singleton 对象的副本,从而确保所有对象都访问唯一实例
l 灵活性:因为类控制了实例化过程,所以类可以更加灵活修改实例化过程
缺点
l 开销:虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销。可以通过使用静态初始化解决此问题,上面的五种实现方式中已经说过了。
l 可能的开发混淆:使用 singleton 对象(尤其在类库中定义的对象)时,开发人员必须记住自己不能使用 new 关键字实例化对象。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类。
l 对象的生存期:Singleton 不能解决删除单个对象的问题。在提供内存管理的语言中(例如基于 .NET Framework 的语言),只有 Singleton 类能够导致实例被取消分配,因为它包含对该实例的私有引用。在某些语言中(如 C++),其他类可以删除
对象实例,但这样会导致 Singleton 类中出现悬浮引用。
适用性
l 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
l 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
应用场景
l 每台计算机可以有若干个打印机,但只能有一个Printer Spooler,避免两个打印作业同时输出到打印机。
(摘自吕震宇的C#设计模式(7)-Singleton Pattern)
l PC机中可能有几个串口,但只能有一个COM1口的实例。
l 系统中只能有一个窗口管理器。
l .NET Remoting中服务器激活对象中的Sigleton对象,确保所有的客户程序的请求都只有一个实例来处理。
总结
Singleton设计模式是一个非常有用的机制,可用于在面向对象的应用程序中提供单个访问点。文中通过五种实现方式的比较和一个完整的示例,完成了对Singleton模式的一个总结和探索。用一句广告词来概括Singleton模式就是“简约而不简单”。
本文详细介绍了Singleton模式的概念、实现方式及应用场景。通过五种实现方式的对比,深入探讨了单例模式的优缺点。

被折叠的 条评论
为什么被折叠?



