成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

最簡單的設計模式學習:Singleton模式

開發 后端
本文介紹了學習設計模式中最簡單的模式:Singleton模式。Singleton的用處自然是保證一個類只有一個唯一的實例。

學習設計模式,自然從最簡單的模式入手,而最簡單的模式便是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
責任編輯:周立方 來源: 百度百科
相關推薦

2024-09-14 08:24:44

設計模式抽象工廠模式JDK

2009-09-02 16:23:27

C# Singleto

2009-08-31 15:48:02

C# Singleto

2011-07-18 16:51:51

Cocoa 單態 模式

2012-08-22 10:10:25

單態單態設計設計模式

2009-07-08 17:25:05

Java Single

2021-03-06 22:50:58

設計模式抽象

2012-07-10 02:01:53

設計模式命令模式

2009-08-31 16:12:02

C#使用Singlet

2011-11-17 16:03:05

Java工廠模式Clojure

2023-07-31 12:27:30

單例設計模式

2009-08-25 18:04:30

C#實現Singlet

2015-11-03 09:43:43

avascript設計模式工廠模式

2021-04-19 21:25:48

設計模式到元

2022-03-15 09:00:00

機器學習軟件開發MLOps

2010-07-21 15:30:40

SQL Server

2021-02-01 10:01:58

設計模式 Java單例模式

2009-08-31 16:01:31

C#和設計模式

2012-08-30 09:07:33

設計模式

2024-04-18 00:22:10

設計模式接口代碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩精品在线视频免费观看 | 欧美日韩精品亚洲 | 欧美精品一区二区三区在线播放 | 涩涩视频在线观看 | 亚洲精品视频免费看 | 欧美性视频在线播放 | 欧美三级电影在线播放 | 久久久久久久久久性 | 久久久久无码国产精品一区 | 一区二区三区av | 欧美一区二区在线播放 | 九九热在线视频免费观看 | 午夜精品在线观看 | 美女视频一区二区三区 | 国产精品毛片一区二区在线看 | 精品国产一区二区三区日日嗨 | 亚洲第一区久久 | 国产成人精品一区二 | 欧美一级欧美三级在线观看 | 国产黄色免费网站 | 国产欧美一区二区三区日本久久久 | 99视频免费看| 色综合天天网 | 免费看91 | 在线一区观看 | 精品一区二区在线观看 | 久久99精品久久久 | 亚洲欧美在线观看 | 91精品国产高清一区二区三区 | 国产精品视频一 | 婷婷中文在线 | 亚洲视频在线观看 | 成人午夜精品 | 欧美日韩不卡 | 欧美日韩18 | 欧美日韩一区二区三区不卡视频 | 国产一级片在线观看视频 | 成人精品一区二区三区中文字幕 | 色av一区二区 | 日本精品裸体写真集在线观看 | 成人超碰|