設計模式C 實現(4) 單例模式

2021-06-19 17:30:31 字數 2198 閱讀 3271

軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了物件導向程式設計語言的重要特性:封裝、繼承、多型,真正領悟設計模式的精髓是可能乙個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用c++寫了個小例子,加深一下理解。主要參考《大話設計模式》和《設計模式:可復用物件導向軟體的基礎》(dp)兩本書。本文介紹單例模式的實現。

單例的一般實現比較簡單,下面是**和uml圖。由於建構函式是私有的,因此無法通過建構函式例項化,唯一的方法就是通過呼叫靜態函式getinstance。

uml圖:

**:[cpp]view plain

copy

print?

class

singleton    

static

singleton *singleton;  

};  

singleton* singleton::singleton = null;  

singleton* singleton::getinstance()    

這裡只有乙個類,如何實現singleton類的子類呢?也就說singleton有很多子類,在一種應用中,只選擇其中的乙個。最容易就是在getinstance函式中做判斷,比如可以傳遞乙個字串,根據字串的內容建立相應的子類例項。這也是dp書上的一種解法,書上給的**不全。這裡重新實現了一下,發現不是想象中的那麼簡單,最後實現的版本看上去很怪異。在vs2008下測試通過。

[cpp]view plain

copy

print?

#pragma once

#include 

using

namespace

std;  

class

singleton    

protected

: //必須為保護,如果是私有屬性,子類無法訪問父類的建構函式

singleton() {}  

private

:  static

singleton *singleton; 

//唯一例項的指標

};  

#include "singleton.h"

#include "singletona.h"

#include "singletonb.h"

singleton* singleton::singleton = null;  

singleton* singleton::getinstance(const

char

* name)  

return

singleton;  

}  

[cpp]view plain

copy

print?

#pragma once

#include "singleton.h"

class

singletona: 

public

singleton  

};  

#pragma once

#include "singleton.h"

class

singletonb: 

public

singleton  

};  

[cpp]view plain

copy

print?

#include "singleton.h"

intmain()    

上面**有乙個地方很詭異,父類為子類的友元,如果不是友元,函式getinstance會報錯,意思就是無法呼叫singletona和singletonb的建構函式。父類中呼叫子類的建構函式,我還是第一次碰到。當然了把singletona和singletonb的屬性設為public,getinstance函式就不會報錯了,但是這樣外界就可以定義這些類的物件,違反了單例模式。

看似奇怪,其實也容易解釋。在父類中構建子類的物件,相當於是外界呼叫子類的建構函式,因此當子類建構函式的屬性為私有或保護時,父類無法訪問。為共有時,外界就可以訪問子類的建構函式了,此時父類當然也能訪問了。只不過為了保證單例模式,所以子類的建構函式不能為共有,但是又希望在父類中構造子類的物件,即需要呼叫子類的建構函式,這裡沒有辦法才出此下策:將父類宣告為子類的友元類。

**:

設計模式C 實現(4) 單例模式

軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了物件導向程式設計語言的重要特性 封裝 繼承 多型,真正領悟設計模式的精髓是可能乙個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用c 寫了個小例子,加深一下理解。主要參考 大話設計模式 和 設...

設計模式C 實現(4) 單例模式

分類 軟體設計模式c 實現 2011 08 11 08 38 53人閱讀收藏 舉報 軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了物件導向程式設計語言的重要特性 封裝 繼承 多型,真正領悟設計模式的精髓是可能乙個漫長的過程,需要大量實踐經驗的積累。最近看設計模式...

設計模式C 實現(4) 單例模式

軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了物件導向程式設計語言的重要特性 封裝 繼承 多型,真正領悟設計模式的精髓是可能乙個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用c 寫了個小例子,加深一下理解。主要參考 大話設計模式 和 設...