C 回顧之static與單例模式

2021-07-23 03:43:14 字數 2024 閱讀 6534

單例模式是應用最多的一種設計模式,它要求每個類有且只能有乙個例項物件,所以用c++設計乙個單例模式的方法如下:

1 建構函式宣告為私有;   這樣就保證了不能隨意構造乙個物件

2 將拷貝建構函式與等號運算子宣告為私有,並不提供他們的實現; 即禁止物件被拷貝。

3 在類中宣告乙個靜態的全域性訪問介面;

4 宣告乙個靜態的私有例項化指標;

[cpp]view plain

copy

class

singleton  

return

instance_;  

}  ~singleton()  

private

:  singleton(const

singleton& other);  

singleton & operator=(const

singleton & other);  

singleton()  

static

singleton *instance_; 

//引用性宣告

};  

singleton * singleton::instance_; //定義性宣告

intmain(

void

)    

上面就是單例類模式的c++實現,但是上述**還有乙個缺陷:

單例類中申請的一些資源沒有被釋放,如instance_指向的空間沒有被**

。一共有兩種解決方式:

第一種解決方式:

[cpp]view plain

copy

class

singleton  

....  

};  

intmain()    

這種方式雖然能實現功能,但是不太方便,每次都要手動**資源,這是它的缺點。

第二種解決方式:

[cpp]view plain

copy

class

singleton  

}  };  

...  

private

:  ...  

static

garbo garbo_;  

//引用性宣告

};  

singleton::garbo singleton::garbo_;//定義性宣告

這種方式提供的處理方式顯然要比第一種方式來的要便捷,因為它依靠內部提供的garbo巢狀類來提供服務,當singleton類生命週期結束時,garbo的類物件garbo_也要銷毀,它將呼叫析構函式,而在析構函式中又自動地釋放了singleton單例類申請的一些資源,這種實現就比較智慧型化。不需要手動釋放資源。這是它的優勢。

下面提供另一種實現c++單例類模式的方法:

[cpp]view plain

copy

class

singleton  

~singleton()  

private

:  singleton()  

singleton(const

singleton &other);  

singleton & operator=(const

singleton &other);  

};  

這種實現方式利用了static修改函式內部的變數,當第一次呼叫getinstance函式時,系統將構造乙個singleton物件,在後續再次呼叫這個函式時,系統不再執行這個語句,也就不會再構造singleton類物件了,而直接返回instance_本身。另外,當singleton類物件生命週期結束時,物件會自動呼叫析構函式銷毀,這裡也就不存在申請資源之類的了,需要注意的是getinstance()函式返回的是引用,這樣就不會呼叫拷貝建構函式了,使用時也應該宣告singleton的引用,如下:

[cpp]view plain

copy

intmain()   

單例模式 回顧

單例模式 讓乙個類只能建立乙個物件 設計模式 設計經驗,是一套固定的設計 的經驗 步驟 1.首先讓建構函式私有化 2.提供一套static修飾的函式 並且 返回乙個物件 單例模式一共有兩種方式表達 1.餓模式 public class ootest private static ootest oo ...

單例模式與static的區別

關於單例和static的。在經過深究後,我的總結如下所示,此總結將從單例的應用場景 單例與static的區別與聯絡兩個方面進行講解。public class counter private counter public static final counter getinstance 2 建立物件時...

C 單例模式實現再回顧

單例模式需要注意的問題 1 static例項保證只有乙個例項 2 需要c 類外初始化例項 執行緒鎖等 3 私化建構函式,關閉賦值運算子 和拷貝建構函式 4 應當有releas函式 5 應該考慮執行緒安全問題 下面是懶漢模式的實現 include include class singleton inc...