最简单的设计模式学习:Singleton模式
创始人
2024-04-13 21:01:41
0

学习设计模式,自然从最简单的模式入手,而最简单的模式便是Singleton。所以***篇就来所以说Singleton模式。看完GOF和Design patterns in Java的书,感觉Singleton虽然简单,但是想写出一个好的Singleton也不是一上来就能写出来的。

Singleton模式的用处自然是保证一个类只有一个***的实例。在建模中涉及到的只能有一个对象,例如Struts中的Action类就是一例。除此之外,Singleton还使得该对象只有一个全局访问点。这就是SIngleton的作用。

说得比较抽象,我们来看一个简单Singleton的C++和Java的代码:

C++ Singleton模式:

类定义:

  1. class Singleton    
  2. {  
  3. public:  
  4.     static Singleton * Instance();  
  5.     ~Singleton();  
  6.  
  7. private:  
  8.     Singleton();  
  9.  
  10.     static Singleton * instance;  
  11. }; 

方法实现:

  1. Singleton * Singleton::instance = 0;  
  2.  
  3. Singleton::Singleton()  
  4. {  
  5.  
  6. }  
  7.  
  8. Singleton::~Singleton()  
  9. {  
  10.  
  11. }  
  12.  
  13. Singleton * Singleton::Instance()  
  14. {  
  15.     if (instance == 0) {  
  16.         instance = new Singleton();  
  17.     }  
  18.  
  19.     return instance;  

Java Singleton模式:

  1. public class Singleton {  
  2.       
  3.     private static Singleton instance;  
  4.       
  5.     public static Singleton getInstance() {  
  6.         if (instance == null)  
  7.             instance = new Singleton();  
  8.           
  9.         return instance;  
  10.     }  
  11.       
  12.     /** *//** Creates a new instance of Singleton */  
  13.     private Singleton() {  
  14.     }  

通过上面的例子可以看出,Singleton的实现并不难,只要将构造函数访问域设为私有,然后添加一个静态引用和一个获得该应用的静态方法即可。其实在C++中定义一个全局静态变量也可以达到这个效果,但是像Java这样的语言就是能使用Singleton了。

上面的程序有一个问题,就是只能运行在单线程的环境下。为此我在C++上作了个实验。首先#include 。在SIngleton::Instance()函数中增加一个Sleep(1000),程序如下:

  1. Singleton * Singleton::Instance()  
  2. {  
  3.     if (instance == 0) {  
  4.         Sleep(1000);  
  5.         instance = new Singleton();  
  6.     }  
  7.  
  8.     return instance;  

然后在主函数中创建两个线程,程序如下:

  1. static Singleton * s1 = 0, * s2 = 0;  
  2.  
  3. DWORD WINAPI ThreadProc1(PVOID)  
  4. {  
  5.     s1 = Singleton::Instance();  
  6.  
  7.     return 0;  
  8. }  
  9.  
  10. DWORD WINAPI ThreadProc2(PVOID)  
  11. {  
  12.     s2 = Singleton::Instance();  
  13.  
  14.     return 0;  
  15. }  
  16.  
  17. int main(int argc, char* argv[])  
  18. {  
  19.     DWORD threadID1;  
  20.     DWORD threadID2;  
  21.  
  22.     CreateThread(NULL, 0, ThreadProc1, NULL, 0, &threadID1);  
  23.     CreateThread(NULL, 0, ThreadProc2, NULL, 0, &threadID2);  
  24.  
  25.     Sleep(10000);  
  26.  
  27.     std::cout << s1 << " " << s2;  
  28.  
  29.     return 0;  

这样修改后在运行程序,打印出来的s1和s2地址就不是同一个地址了。结果如下:
0372D68 00372E68Press any key to continue

可见当在多线程环境下使用这个Singleton就会出现创建不止一个实力的情况,所以我们需要给Singleton加锁。请看下面的代码。

C++ Singleton模式:

  1. class Singleton    
  2. {  
  3. public:  
  4.     static Singleton * Instance();  
  5.     virtual ~Singleton();  
  6.  
  7. private:  
  8.     Singleton();  
  9.  
  10.     static CMutex mutex;  
  11.     static Singleton * instance;  
  12. }; 
  1. Singleton * Singleton::instance = 0;  
  2. CMutex Singleton::mutex;  
  3.  
  4. Singleton::Singleton()  
  5. {  
  6.  
  7. }  
  8.  
  9. Singleton::~Singleton()  
  10. {  
  11.  
  12. }  
  13.  
  14. Singleton * Singleton::Instance()  
  15. {  
  16.     mutex.Lock();  
  17.  
  18.     if (instance == 0) {  
  19.         Sleep(1000);  
  20.         instance = new Singleton();  
  21.     }  
  22.  
  23.     mutex.Unlock();  
  24.  
  25.     return instance;  

此外需要#include < afxmt.h>,,并且在项目设置中要设置动态链接MFC库。

Java Singleton模式:

  1. public class Singleton {  
  2.       
  3.     private static Singleton instance;  
  4.     private static Object lock = Singleton.class;  
  5.       
  6.     public static Singleton getInstance() {  
  7.         synchronized (lock) {  
  8.             if (instance == null)  
  9.                 instance = new Singleton();  
  10.               
  11.             return instance;  
  12.         }  
  13.     }  
  14.       
  15.     /** *//** Creates a new instance of Singleton */  
  16.     private Singleton() {  
  17.     }  

运用加锁就可以解决在多线程环境下使用Singleton模式所带来的问题了。

【编辑推荐】

  1. 详解Java Singleton模式的好处
  2. Java设计模式与应用浅谈
  3. 设计模式在EJB中的应用
  4. 探讨JSF框架中使用的设计模式
  5. J2EE设计模式之Template

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...