国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

C++設計模式之Singleton

2019-11-17 05:01:54
字體:
來源:轉載
供稿:網友
一、功能   保證一個類僅有一個實例。   三、優缺點 Singleton模式是做為"全局變量"的替代品出現的。所以它具有全局變量的特點:全局可見、貫穿應用程序的整個生命期,它也具有全局變量不具備的性質:同類型的對象實例只可能有一個。   四、實現  教科書上的Singleton定義如下:
class Singleton
{
public:
static Singleton* Instance() ;
PRotected:
Singleton() {}
private:
static Singleton *_instance ;
Singleton(const Singleton&) ;
Singleton& Operator=(const Singleton&) ;
} ;Singleton* Singleton::_instance = NULL ;Singleton* Singleton::Instance()
{
(_instance == NULL) ? _instance = new Singleton() : 0 ; //lazy initialization
return _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
{class Singleton
{
public:
static Singleton* Instance() { static Singleton _instance ; return &_instance ; }
protected:
Singleton() {}
private:
Singleton(const Singleton&) ;
Singleton& operator=(const Singleton&) ;
} ;
}客戶端代碼:
{
using namespace DesignPattern_Singleton ;
Singleton *p = Singleton::Instance() ;
......
}  (2)有子類的情況
方法一:
namespace DesignPattern_Singleton
{
// class Singleton
class Singleton
{
protected:
Singleton() {}
static Singleton *_instance ;
private:
Singleton(const Singleton&) ;
Singleton& operator=(const Singleton&) ;
} ;
Singleton* Singleton::_instance = NULL ;// class ConcreteSingleton
class ConcreteSingleton : public Singleton
{
public:
static Singleton* Instance() ;
protected:
ConcreteSingleton() {}
} ;Singleton* ConcreteSingleton::Instance()
{
(_instance == NULL) ? _instance = new ConcreteSingleton() : 0 ;
return _instance ;
}
}客戶端代碼:
{
using namespace DesignPattern_Singleton ;
Singleton *p = ConcreteSingleton::Instance() ;
}方法二:
namespace DesignPattern_Singleton
{
// class Singleton
class Singleton
{
protected:
Singleton() {}
private:
Singleton(const Singleton&) ;
Singleton& operator=(const Singleton&) ;
} ;// class ConcreteSingleton
class ConcreteSingleton : public Singleton
{
public:
static Singleton* Instance() { static ConcreteSingleton _instance ; return &_instance ; }
protected:
ConcreteSingleton() {}
} ;
}客戶端代碼:
{
using namespace DesignPattern_Singleton ;
Singleton *p = ConcreteSingleton::Instance() ;

}方法三:
namespace DesignPattern_Singleton
{
template < class T >
class Singleton
{
public:
static T* Instance() { static T _instance ; return &_instance ; }
protected:
Singleton() {}
private:
Singleton(const Singleton &) ;
Singleton& operator=(const Singleton&) ;
} ;class ConcreteSingleton : public Singleton< ConcreteSingleton > {} ;
}客戶端代碼
{
using namespace DesignPattern_Singleton ;ConcreteSingleton *p = ConcreteSingleton::Instance() ;
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 灵川县| 颍上县| 繁峙县| 寻甸| 海宁市| 大安市| 清水河县| 陆良县| 静宁县| 汤原县| 嘉黎县| 库车县| 昌平区| 库伦旗| 盈江县| 青川县| 长垣县| 景德镇市| 定陶县| 吴桥县| 望谟县| 南召县| 铁力市| 呼图壁县| 密云县| 磴口县| 新泰市| 石嘴山市| 象山县| 松滋市| 普宁市| 蒙自县| 壤塘县| 阿坝| 库伦旗| 兴海县| 北海市| 兰溪市| 调兵山市| 体育| 甘南县|