單例的一般實現比較簡單,下面是**和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函式就不會報錯了,但是這樣外界就可以定義這些類的物件,違反了單例模式。
看似奇怪,其實也容易解釋。在父類中構建子類的物件,相當於是外界呼叫子類的建構函式,因此當子類建構函式的屬性為私有或保護時,父類無法訪問。為共有時,外界就可以訪問子類的建構函式了,此時父類當然也能訪問了。只不過為了保證單例模式,所以子類的建構函式不能為共有,但是又希望在父類中構造子類的物件,即需要呼叫子類的建構函式,這裡沒有辦法才出此下策:將父類宣告為子類的友元類。
設計模式 單例模式
單例模式 singleton pattern 是乙個比較簡單的模式,其定義如下 ensure a class has only one instance,and provide a golbal point of acess to it.確保某乙個類只有乙個例項,而且自行例項化並且向整個系統提供這個...
設計模式 單例模式
class testsingleton static public function instance return self testsingleton private function clone public function setsinvar sinvar public function ...
設計模式 單例模式
單例模式的目的是保證類在系統中只被例項化一次,由該唯一的例項來為系統提供服務.單例模式主要用於保證服務的統一,比如獲取統一的編號服務,模仿oracle的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...