C 設計模式之Singleton

2021-04-02 02:11:37 字數 2418 閱讀 3406

一、功能

保證乙個類僅有乙個例項。

二、結構圖

三、優缺點

singleton模式是做為"全域性變數"的替代品出現的。所以它具有全域性變數的特點:全域性可見、貫穿應用程式的整個生命期,它也具有全域性變數不具備的性質:同型別的物件例項只可能有乙個。

四、實現

教科書上的singleton定義如下:

class singleton

private:

static singleton *_instance ;

singleton(const singleton&) ;

singleton& operator=(const singleton&) ;

} ;singleton* singleton::_instance = null ;

singleton* singleton::instance()

(1)因為返回的是指標,為防止使用者呼叫delete函式,可把static singleton *_instance;改為在instance()中定義static singleton _instance。這樣顯然更安全,同時也具有lazy initialization的特性(即第一次訪問時才建立)。

(2)假設需要從singleton派生子類,而子類也需要有同樣的性質,既只能建立乙個例項。我覺得,這很難辦。根本原因在於instance()函式不是虛函式,不具有多型的性質。一種常用方法是把instance()函式移到子類中,這時就只能用static singleton *_instance,而不能用static singleton _instance了,除非把_instance也要移到子類,無論怎麼做都不優雅。另一種方法是用模板。具體用什麼方法,只能根據實際情況權衡。

五、示例**

(1)沒子類的情況

namespace designpattern_singleton

protected:

singleton() {}

private:

singleton(const singleton&) ;

singleton& operator=(const singleton&) ;

} ;}

客戶端**:

(2)有子類的情況

方法一:

namespace designpattern_singleton

static singleton *_instance ;

private:

singleton(const singleton&) ;

singleton& operator=(const singleton&) ;

} ;singleton* singleton::_instance = null ;

// class concretesingleton

class concretesingleton : public singleton

} ;singleton* concretesingleton::instance()

}客戶端**:

方法二:

namespace designpattern_singleton

private:

singleton(const singleton&) ;

singleton& operator=(const singleton&) ;

} ;// class concretesingleton

class concretesingleton : public singleton

protected:

concretesingleton() {}

} ;}

客戶端**:

方法三:

namespace designpattern_singleton

protected:

singleton() {}

private:

singleton(const singleton &) ;

singleton& operator=(const singleton&) ;

} ;class concretesingleton : public singleton< concretesingleton > {} ;

}客戶端**

C 設計模式之Singleton

一 功能保證乙個類僅有乙個例項。二 結構圖 三 優缺點 singleton模式是做為 全域性變數 的替代品出現的。所以它具有全域性變數的特點 全域性可見 貫穿應用程式的整個生命期,它也具有全域性變數不具備的性質 同型別的物件例項只可能有乙個。四 實現 教科書上的singleton定義如下 class...

C 設計模式之Singleton

名稱 singleton 結構 意圖 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。適用性 當類只能有乙個例項而且客戶可以從乙個眾所周知的訪問點訪問它時。當這個唯一例項應該是通過子類化可擴充套件的,並且客戶應該無需更改 就能使用乙個擴充套件的例項時。示例 singleton namespa...

C 設計模式之Singleton模式

singleton是二十三個設計模式中比較重要也比較經常使用的模式。但是這個模式雖然簡單,實現起來也會有一些小坑,讓我們一起來看看吧!首先我們看看這個設計模式的uml類圖。很清晰的可以看到,有三點是需要我們在實現這個模式的時候注意的地方。其中,私有化構造器是防止外部使用者建立新的例項而靜態方法用於返...