注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天涯倦客的博客

祝福你朋友永远快乐!

 
 
 

日志

 
 

单件模式(Singleton Pattern)二  

2011-03-17 11:29:39|  分类: 设计模式 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

优点

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对象,确保所有的客户程序的请求都只有一个实例来处理。

完整示例

这是一个简单的计数器例子,四个线程同时进行计数。

 1单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客using System; 
 2单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客using System.Threading; 
 3单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客 
 4单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客namespace SigletonPattern.SigletonCounter 
 5单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客
 6单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客    /// <summary> 
 7单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客    /// 功能:简单计数器的单件模式 
 8单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客    /// 编写:Terrylee 
 9单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客    /// 日期:2005年12月06日 
10单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客    /// </summary>
 
11单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客    public class CountSigleton 
12单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客    
13单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客        ///存储唯一的实例 
14单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客        static CountSigleton uniCounter = new CountSigleton();   
15单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客    
16单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客        ///存储计数值 
17单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客        private int totNum = 0;   
18单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客    
19单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客        private CountSigleton()  
20单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客    
21单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客        {  
22单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客            ///线程延迟2000毫秒 
23单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客            Thread.Sleep(2000); 
24单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客        }
  
25单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客    
26单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客        static public CountSigleton Instance()  
27单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客    
28单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客        {  
29单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客    
30单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客            return uniCounter;  
31单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客    
32单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客        }
  
33单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客         
34单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客        ///计数加1 
35单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客        public void Add() 
36单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客        {  
37单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客            totNum ++
38单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客        }
   
39单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客         
40单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客        ///获得当前计数值 
41单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客        public int GetCounter() 
42单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客        {  
43单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客            return totNum; 
44单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客        }
  
45单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客 
46单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客    }
 
47单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客}
 
48单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客

 

 1单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客using System;
 2单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客using System.Threading;
 3单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客using System.Text;
 4单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客
 5单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客namespace SigletonPattern.SigletonCounter
 6单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客{
 7单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客    /// <summary>
 8单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客    /// 功能:创建一个多线程计数的类
 9单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客    /// 编写:Terrylee
10单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客    /// 日期:2005年12月06日
11单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客    /// </summary>

12单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客    public class CountMutilThread
13单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客    {
14单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客        public CountMutilThread()
15单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客        {
16单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客            
17单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客        }

18单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客
19单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客        /// <summary>
20单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客        /// 线程工作
21单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客        /// </summary>

22单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客        public static void DoSomeWork()
23单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客        {
24单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客            ///构造显示字符串
25单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客            string results = "";
26单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客
27单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客            ///创建一个Sigleton实例
28单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客            CountSigleton MyCounter = CountSigleton.Instance();
29单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客
30单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客            ///循环调用四次
31单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客            for(int i=1;i<5;i++)
32单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客            {
33单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客                ///开始计数
34单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客                MyCounter.Add();
35单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客                
36单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客                results +="线程";
37单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客                results += Thread.CurrentThread.Name.ToString() + "——〉";
38单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客                results += "当前的计数:";
39单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客                results += MyCounter.GetCounter().ToString();
40单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客                results += "\n";
41单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客
42单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客                Console.WriteLine(results);
43单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客                
44单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客                ///清空显示字符串
45单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客                results = "";
46单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客            }

47单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客        }

48单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客
49单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客        public void StartMain()
50单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客        {
51单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客
52单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客            Thread thread0 = Thread.CurrentThread; 
53单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客   
54单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客            thread0.Name = "Thread 0"
55单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客   
56单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客            Thread thread1 =new Thread(new ThreadStart(DoSomeWork)); 
57单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客   
58单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客            thread1.Name = "Thread 1"
59单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客   
60单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客            Thread thread2 =new Thread(new ThreadStart(DoSomeWork)); 
61单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客   
62单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客            thread2.Name = "Thread 2"
63单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客   
64单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客            Thread thread3 =new Thread(new ThreadStart(DoSomeWork)); 
65单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客   
66单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客            thread3.Name = "Thread 3"
67单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客   
68单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客            thread1.Start(); 
69单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客   
70单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客            thread2.Start(); 
71单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客   
72单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客            thread3.Start(); 
73单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客            
74单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客            ///线程0也只执行和其他线程相同的工作
75单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客            DoSomeWork(); 
76单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客        }

77单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客    }

78单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客}

79单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客

 

 1单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客using System; 
 2单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客using System.Text; 
 3单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客using System.Threading; 
 4单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客 
 5单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客namespace SigletonPattern.SigletonCounter 
 6单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客
 7单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客    /// <summary> 
 8单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客    /// 功能:实现多线程计数器的客户端 
 9单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客    /// 编写:Terrylee 
10单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客    /// 日期:2005年12月06日 
11单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客    /// </summary>
 
12单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客    public class CountClient 
13单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客    
14单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客        public static void Main(string[] args) 
15单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客        
16单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客       CountMutilThread cmt = new CountMutilThread(); 
17单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客 
18单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客            cmt.StartMain(); 
19单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客 
20单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客            Console.ReadLine(); 
21单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客        }
 
22单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客    }
 
23单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客}
 
24单件模式(Singleton Pattern)二 - 海里的贝壳 - apple的博客

 

 

总结

Singleton设计模式是一个非常有用的机制,可用于在面向对象的应用程序中提供单个访问点。文中通过五种实现方式的比较和一个完整的示例,完成了对Singleton模式的一个总结和探索。用一句广告词来概括Singleton模式就是“简约而不简单”。

_________________________________________________________________________________________________
源码下载:/Files/Terrylee/SigletonPattern.rar

参考文献:

C#计模式》,中国电力出版社

使用 Microsoft .NET 的企业解决方案模式

Implementing the Singleton Pattern in C#

MSDNExploring the Singleton Design Pattern

吕震宇C#设计模式(7)-Singleton Pattern

C#的Singleton设计模式

作者:TerryLee
出处:http://terrylee.cnblogs.com 
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  评论这张
 
阅读(586)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017