設計模式 單例模式

2021-06-27 05:59:41 字數 1993 閱讀 6894

單例的一般實現比較簡單,下面是**和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的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...