程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 面試題1:如何實現C++單例模式?

面試題1:如何實現C++單例模式?

編輯:C++入門知識

1. 軟件領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了面向對象編程語言的重要特性:封裝、繼承、多態。真正領悟設計模式的精髓是可能一個漫長的過程,需要大量實踐經驗的積累。

 

2. 當僅允許類的一個實例在應用中被創建的時候,我們使用單例模式(Singleton Pattern)。它保護類的創建過程來確保只有一個實例被創建,它通過設置類的構造方法為私有(private)來實現。要獲得類的實例,單例類可以提供一個方法,如getInstance,來返回類的實例。該方法是唯一可以訪問類來創建實例的方法。例如:

C++代碼:
 
 

//Singleton.h  
class Singleton   
{ 
public: 
    static Singleton* GetInstance(); 
private: 
    Singleton() {} 
    static Singleton *m_pInstance; 
}; 
//Singleton.cpp  
Singleton* Singleton::m_pInstance = NULL; 
Singleton* Singleton::GetInstance() 
{ 
    if(m_pInstance == NULL) 
        m_pInstance = new Singleton(); 
    return m_pInstance; 
} 
//Singleton.h
class Singleton 
{
public:
 static Singleton* GetInstance();
private:
 Singleton() {}
 static Singleton *m_pInstance;
};
//Singleton.cpp
Singleton* Singleton::m_pInstance = NULL;
Singleton* Singleton::GetInstance()
{
 if(m_pInstance == NULL)
  m_pInstance = new Singleton();
 return m_pInstance;
}

該類有以下特征:

◆它的構造函數是私有的,這樣就不能從別處創建該類的實例。

◆它有一個唯一實例的靜態指針m_pInstance,且是私有的。

◆它有一個公有的函數,可以獲取這個唯一的實例,並在需要的時候創建該實例。

 

3. 但它仍然存在問題,m_pInstance指向的空間什麼時候釋放呢?更嚴重的問題是,這個實例的析構操作什麼時候執行? 如果在類的析構行為中有必須的操作,比如關閉文件,釋放外部資源,那麼上面所示的代碼無法實現這個要求。我們需要一種方法,正常地刪除該實例。

妥善的方法是讓類自己在合適的時候把自己刪除。

程序在結束的時候,系統會自動析構所有的全局變量。事實上,系統也會析構所有的類的靜態成員變量,就像這些靜態成員也是全局變量一樣。利用這個特征,我們可以在C++單例模式類中定義一個這樣的靜態成員變量,而它的唯一工作就是在析構函數中刪除單例類的實例。如下面的代碼中的CGarbo類(Garbo意為垃圾工人):

 
 

class Singleton 
{ 
  // 其它成員     
public:   
    static Singleton * GetInstance(){。。。}   
  private:  
 Singleton(){};  
 static Singleton * m_pInstance;  
 class CGarbo // 它的唯一工作就是在析構函數中刪除CSingleton的實例  
  {   
public:  
 ~CGarbo()  
 {   
if (Singleton::m_pInstance)   
delete Singleton::m_pInstance;   
}  
 };  
  static CGarbo Garbo; // 定義一個靜態成員,在程序結束時,系統會調用它的析構函數   
 }  
class Singleton
{
  // 其它成員  
public: 
    static Singleton * GetInstance(){。。。} 
  private:
 Singleton(){};
 static Singleton * m_pInstance;
 class CGarbo // 它的唯一工作就是在析構函數中刪除CSingleton的實例
  { 
public:
 ~CGarbo()
 { 
if (Singleton::m_pInstance) 
delete Singleton::m_pInstance; 
}
 };
  static CGarbo Garbo; // 定義一個靜態成員,在程序結束時,系統會調用它的析構函數
 }

類CGarbo被定義為CSingleton的私有內嵌類,以防該類被在其它地方濫用。

在程序運行結束時,系統會調用CSingleton的靜態成員Garbo的析構函數,該析構函數會刪除單例的唯一實例。

使用這種方法釋放單例對象有以下特征:

◆在單例類內部定義專有的嵌套類。

◆在單例類內定義私有的專門用於釋放的靜態成員。

◆利用程序在結束時析構全局變量的特性,選擇最終的釋放時機。

◆使用C++單例模式的代碼不需要任何操作,不必關心對象的釋放。

 


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved