單例項設計模式的實現

2021-06-03 04:36:52 字數 1622 閱讀 9112

單例項設可能是使用最廣泛的設計模式。其思想意圖是保證乙個類只有乙個例項,並且提供類物件的全程訪問。單例項物件應用的範圍很廣:如gui應用必須是單滑鼠,modem的聯接需要一條且只需要一條**線,作業系統只能有乙個視窗管理器,一台pc連乙個鍵盤。本文將討論如何用c++實現單例項模式,並解釋如何優化單執行緒應用的設計。

設計方案

使用全程物件能夠保證方便地訪問例項,但是不能保證只宣告乙個物件-也就是說除了乙個全程例項外,仍然能建立相同類的本地例項。單例項模式通過類本身來管理其唯一例項,這種特性提供了問題的解決辦法。唯一的例項是類的乙個普通物件,但設計這個類時,讓它只能建立乙個例項並提供對此例項的全程訪問。唯一例項類singleton在靜態成員函式中隱藏建立例項的操作。習慣上把這個成員函式叫做instance(),它的返回值是唯一例項的指標。singleton的定義如下:

class singleton 

;你還可以建立諸如mouse,filemanager,scheduler等為名字的類並宣告相應的成員。為了保證使用者不能建立類的本地例項,singleton的構造器是賦值操作符,建構函式的副本被宣告為protected。類中還宣告了乙個私有的靜態例項指標。當第一次呼叫靜態函式instance()時,它建立唯一例項,將例項位址賦值給pinstance,然後返回這個位址。在每次併發呼叫中,instance()也將只返回這個位址。

下面是類的實現:

singleton* singleton::pinstance = 0;// 初始化指標

singleton* singleton::instance () 

return pinstance; // 唯一例項的位址

}singleton::singleton() 

使用者訪問唯一例項的方法只有instance()成員函式。如果不通過這個函式,任何建立例項的嘗試都將失敗,因為類的建構函式是被保護的。instance()使用懶惰初始化,也就是說它返回的值是當這個函式被首次訪問時被建立的。這是一種防彈設計-所有instance()之後的呼叫都返回相同例項的指標:

singleton *p1 = singleton::instance();

singleton *p2 = p1->instance();

singleton & ref = * singleton::instance();

雖然本文的例子針對的是單例項,但對instance()稍加修改,這個設計模板便可適用於可變多例項情況。如乙個類允許最多五個例項。

優化singleton類,使之適用於單執行緒應用

singleton使用操作符new為唯一例項分配儲存空間。因為new操作符是執行緒安全的,在多執行緒應用中你可以使用此設計模板。但是有乙個缺陷:就是在應用程式終止之前必須手工用delete摧毀例項。否則,不僅導致記憶體溢位,還要造成不可**的行為,因為singleton的析構函式將根本不會被呼叫。而通過使用本地靜態例項代替動態例項,單執行緒應用可以很容易避免這個問題。以下是與上面的instance()稍有不同的實現,這個實現專門用於單執行緒應用:

singleton* singleton::instance () 

本地靜態物件例項inst是第一次呼叫instance()時被構造,一直保持活動狀態直到應用程式終止。指標pinstance變得多餘並可以從類定義中刪除掉。與動態分配物件不同,靜態物件當應用程式終止時被自動銷毀掉,所以就不必再手動銷毀例項了。

設計模式之單例項模式

例項,也就是物件,單例項,就是只能有乙個物件。那怎樣才能讓乙個類只能例項化乙個物件呢?很簡單,首先需要讓類的構造方法私有化,這樣外界就不能隨意的例項化物件了。接著,提供乙個公共的靜態的方法返回這個物件,讓外界得到這個類的物件。以乙個學生類為例 package com.techck.file auth...

單例項Singleton設計模式

單例項singleton設計模式 這個設計模式主要目的是想在整個系統中只能出現乙個類的例項。這樣做當然是有必然的,比如你的軟體的全域性配置資訊,或者是乙個factory,或是乙個主控類,等等。你希望這 個類在整個系統中只能出現乙個例項。singleton的版本1.0 public class sin...

設計模式 單例模式 含例項

單例模式,非常常見的一種設計模式。需求 乙個類提供訪問該類物件的唯一方式,且全域性中有且僅有唯一乙個該類的例項。實現方式 1.建構函式private,類外不可建立類例項 2.提供訪問類例項的介面getinstance 3.建立static private的類物件 ifndef main h defi...