C++設計モード-単品
22489 ワード
定義#テイギ#
Singleton
)モードでは、クラスにインスタンスが1つしかないことを保証し、グローバル・アクセス・ポイントを提供します.
こうぞう
理解する
1. Singleton
モードは、グローバル静的変数の代わりに使用されます.C++
クラスインスタンスのグローバル一意性は、静的メンバー変数によって実現されます.
2. instance()
方法は、単品が提供する唯一の呼び出しエントリです.
要点
1.
外部呼び出しによる複数のインスタンスの生成を防止するために、構築方法、プロファイル方法、コピー構築方法、付与リロード方法をprotectedとする
.
2. instance()
メソッド生成オブジェクトには、ローカルstaticを使用する2つの方法があります.
対象、生命期は初めて局所生命期に入って発生し、プログラムの終了時に破棄される.new経由
新しいオブジェクトを生成し、プロファイルメソッドでdelete
オブジェクト.
3.
単品インスタンス呼び出しの取得方法:Singleton::instance()
オブジェクトポインタを取得します.
4.
マルチスレッドリソースの競合条件を解決します.ロック前とロック後にオブジェクトが発生したかどうかを検出することで、ロック効率を保証し、単一のインスタンスの一意性を保証することができる、有名な「デュアル検出ロック」メソッドを使用して解決します.
適用
1.
コード部分使用クラステンプレート単品(CSingleton
)、異なる種類の単品類を生成することができる.
2.
一つのクラスは単品クラスになり、単品クラスを自分の友元として実現しなければならない.CSingletonで
の構造も析出もprotected
.また,単品を継承することで実現することもある.
3.
単品は簡単に実現できるし、十分に複雑である.
Loki
ライブラリは比較的複雑な単品を実現し、タイプと各種ポリシー(作成ポリシー、ライフサイクルポリシー、スレッドポリシーなど)をテンプレートパラメータとしてSingletonHolderにカプセル化
クラステンプレート.詳細:
http://loki-lib.sourceforge.net/index.php?n=Pattern.Singleton
ソースコード
変換元:
http://www.shenmiguo.com/archives/2009/282_design-patterns-singleton.html
Singleton
)モードでは、クラスにインスタンスが1つしかないことを保証し、グローバル・アクセス・ポイントを提供します.
こうぞう
理解する
1. Singleton
モードは、グローバル静的変数の代わりに使用されます.C++
クラスインスタンスのグローバル一意性は、静的メンバー変数によって実現されます.
2. instance()
方法は、単品が提供する唯一の呼び出しエントリです.
要点
1.
外部呼び出しによる複数のインスタンスの生成を防止するために、構築方法、プロファイル方法、コピー構築方法、付与リロード方法をprotectedとする
.
2. instance()
メソッド生成オブジェクトには、ローカルstaticを使用する2つの方法があります.
対象、生命期は初めて局所生命期に入って発生し、プログラムの終了時に破棄される.new経由
新しいオブジェクトを生成し、プロファイルメソッドでdelete
オブジェクト.
3.
単品インスタンス呼び出しの取得方法:Singleton::instance()
オブジェクトポインタを取得します.
4.
マルチスレッドリソースの競合条件を解決します.ロック前とロック後にオブジェクトが発生したかどうかを検出することで、ロック効率を保証し、単一のインスタンスの一意性を保証することができる、有名な「デュアル検出ロック」メソッドを使用して解決します.
適用
1.
コード部分使用クラステンプレート単品(CSingleton
)、異なる種類の単品類を生成することができる.
2.
一つのクラスは単品クラスになり、単品クラスを自分の友元として実現しなければならない.CSingletonで
の構造も析出もprotected
.また,単品を継承することで実現することもある.
3.
単品は簡単に実現できるし、十分に複雑である.
Loki
ライブラリは比較的複雑な単品を実現し、タイプと各種ポリシー(作成ポリシー、ライフサイクルポリシー、スレッドポリシーなど)をテンプレートパラメータとしてSingletonHolderにカプセル化
クラステンプレート.詳細:
http://loki-lib.sourceforge.net/index.php?n=Pattern.Singleton
ソースコード
#include <iostream>
using namespace std;
//////////////////Singleton
/**
* @class CSingleton
* @brief ,
* :
* Class C
* {
* friend class CSingleton<C>;
* protected:
* C(){};
* }
*/
template<class T>
class CSingleton
{
public:
static T* instance()
{
//double check. ,
if (!m_pInstance)
{
//TODO: . CMutexGuard guard(m_lock);
if (!m_pInstance)
{
//static T t;
//m_pInstance = &t;
m_pInstance = new T;
}
}
return m_pInstance;
};
protected:
CSingleton(){}; //
CSingleton(const CSingleton&){}; //
CSingleton &operator =(const CSingleton&){}; //
virtual ~CSingleton()
{
if (m_pInstance)
{
delete m_pInstance;
m_pInstance = NULL;
}
};
private:
static T* m_pInstance; //
//TODO: m_lock
};
//////////////////Singleton
template<class T> T* CSingleton<T>::m_pInstance = NULL;
/////////////////Singleton
class CMyLog
{
friend class CSingleton<CMyLog>; // CSingleton
public:
void Log(char* pszStr)
{
cout << "Log msg: " << pszStr << endl;
}
private:
CMyLog(){}; //
};
int main()
{
CMyLog* pLog = CSingleton<CMyLog>::instance();
pLog->Log("hello word");
system("pause");
return 0;
}
1
#include
<
iostream
>
2
using
namespace
std;
3
4
//////////////////
Singleton
5
/*
*
6
* @class CSingleton
7
* @brief ,
8
* :
9
* Class C
10
* {
11
* friend class CSingleton<C>;
12
* protected:
13
* C(){};
14
* }
15
*/
16
template
<
class
T
>
17
class
CSingleton
18
{
19
public
:
20
static
T
*
instance()
21
{
22
//
double check. ,
23
if
(
!
m_pInstance)
24
{
25
//
TODO: . CMutexGuard guard(m_lock);
26
27
if
(
!
m_pInstance)
28
{
29
//
static T t;
30
//
m_pInstance = &t;
31
m_pInstance
=
new
T;
32
}
33
}
34
return
m_pInstance;
35
};
36
37
protected
:
38
CSingleton(){};
//
39
CSingleton(
const
CSingleton
&
){};
//
40
CSingleton
&
operator
=
(
const
CSingleton
&
){};
//
41
virtual
~
CSingleton()
42
{
43
if
(m_pInstance)
44
{
45
delete m_pInstance;
46
m_pInstance
=
NULL;
47
}
48
};
49
50
private
:
51
static
T
*
m_pInstance;
//
52
//
TODO: m_lock
53
};
54
55
56
//////////////////
Singleton
57
template
<
class
T
>
T
*
CSingleton
<
T
>
::m_pInstance
=
NULL;
58
59
60
///////////////
//Singleton
61
class
CMyLog
62
{
63
64
friend
class
CSingleton
<
CMyLog
>
;
//
CSingleton
65
66
public
:
67
void
Log(
char
*
pszStr)
68
{
69
cout
<<
"
Log msg:
"
<<
pszStr
<<
endl;
70
}
71
72
private
:
73
CMyLog(){};
//
74
};
75
76
int
main()
77
{
78
CMyLog
*
pLog
=
CSingleton
<
CMyLog
>
::instance();
79
pLog
->
Log(
"
hello word
"
);
80
81
system(
"
pause
"
);
82
return
0
;
83
}
変換元:
http://www.shenmiguo.com/archives/2009/282_design-patterns-singleton.html