在程式中,有很多類是需要確保有且僅有乙個例項的,這樣才能保證它的正確性和高效性。例如乙個系統只能有乙個視窗管理器或者是列印的後台處理程式。
使得乙個類只有乙個例項的最容易方法就是在類中包含乙個靜態變數,在變數在第乙個例項生成時被初始化,然後每次進入建構函式時就做檢查,如果此變數還不存在,那麼就返回乙個新的例項;否則,就返回乙個新的例項。
public class spooler
public static spooler getspoller()
else
}}
在上面的**中我們將建構函式宣告為私有的,這樣我們就可以防止類的使用者任意的建立新的例項,而是只能通過靜態成員函式的方法來建立。在靜態方法中,如果類已經被例項過了,就返回null。
下面是使用這個類的一段**。
spooler sp = spooler.getspoller();
if(sp != null)
spooler sp2 = spooler.getspoller();
if(sp2 == null)
如果嘗試直接建立splooer的例項,那麼在編譯時就會失敗,因為建構函式已經被宣告為私有的了。
//編譯時失敗
splooer sp = new splooer();
上述方法有乙個缺點,就是總是需要程式設計者檢查getsplooer()方法的返回值,但是往往程式設計者會忘記進行這項檢查。
所以我們將對上述類進行乙個改進:使用異常,如果打算對它例項化超過一次,該類就會丟擲乙個異常。
public class singletonexception:exception
}public class spooler
else
}public static void main()
catch(singletonexception e)
console.writeline("opening the second printer!\n");
trycatch(singletonexception e)
}}
從單件類繼承會比較困難,因為只有在單件基類還沒有被例項化的情況下這一做法才是有效的。
可以很容易的修改單件類來支援建立不止乙個例項。
設計模式 單件模式
1 1 singleton.h ifndef singleton h define singleton h include using namespace std class singleton 構構函式,防止拷貝構造另乙個例項,作為protected singleton 析構函式,作為protec...
設計模式 單件模式
2015年1月29日16 02 59 單件模式是用來保證共有資源唯一性的設計模式,舉個例子吧,假如我們是藝人,我們在同乙個經紀人的協助下開展工作,我們可以委託這個經紀人做一些事情,但是我們不能委託經紀人在幫你做報表的同時幫我訂外賣。用程式猿的語言來表達就是,我們可能在多處地方持有對同一資源的引用。由...
設計模式 單件模式
保持單一物件有時非常必要,尤其是資源類,比如視窗資源,登錄檔等等,所謂的單件模式的定義是 確保乙個類只有乙個例項,並提供乙個全域性的訪問點。其類圖雖說比較簡單,但單例模式還是有很多陷阱的。首先,給出單例模式的經典的懶漢式寫法 懶漢式 需要例項物件時才建立,延遲建立 class single pubi...