1. 機能: クラスにインスタンスが 1 つだけあることを確認します。 3. 長所と短所 シングルトン モードは、「グローバル変数」の代わりに使用されます。したがって、これにはグローバル変数の特性があります。つまり、グローバルに表示され、アプリケーションのライフサイクル全体を通じて実行されます。また、グローバル変数にはないプロパティもあります。同じタイプのオブジェクト インスタンスは 1 つだけです。 4. 教科書のシングルトン定義を次のように実装します。
class Singleton
{
public:
static Singleton* Instance() ;
PROtected:
Singleton() {}
private:
static Singleton *_instance ;
Singleton(constシングルトン& ) ;
シングルトン& 演算子=(const シングルトン&) ;
} ; シングルトン* シングルトン::_インスタンス = NULL ; シングルトン::インスタンス()
(_instance == NULL) ? 0 ; //lazyInitialization
return _instance ;
} (1) ポインタが返されるため、ユーザーが削除関数を呼び出すのを防ぐために、Instance() で static Singleton *_instance を定義するように変更できます。これは明らかに安全であり、遅延初期化の特性もあります (つまり、最初のアクセス時にのみ作成されます)。
(2) Singleton からサブクラスを派生する必要があり、そのサブクラスもインスタンスを 1 つだけ作成できる同じプロパティを持つ必要があるとします。これは難しいと思います。根本的な理由は、Instance() 関数が仮想関数ではなく、多態性のプロパティを持たないことです。一般的な方法は、Instance() 関数をサブクラスに移動することです。この場合、_instance をサブクラスに移動しない限り、静的 Singleton *_instance は使用できません。エレガント。もう 1 つの方法は、テンプレートを使用することです。使用される具体的な方法は、実際の状況に応じて検討するしかありません。
5. サンプルコード(1) サブクラス名前空間なし DesignPattern_Singleton
{ class Singleton
{
public:
static Singleton* Instance() { static Singleton _instance }
protected:
Singleton() {}
private:
Singleton(const Singleton&) ;
Singleton& 演算子=(const Singleton&) ;
} ;
} クライアント コード:
{
名前空間 DesignPattern_Singleton を使用 ;
Singleton *p = Singleton::Instance() ;
.... ....
} (2) サブクラスがある場合
方法1:
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 ;
}
} クライアント コード:
{
名前空間 DesignPattern_Singleton;
Singleton *p = ConcreteSingleton::Instance();
} 方法 2:
名前空間 DesignPattern_Singleton
{
// class Singleton
class Singleton
{
protected:
Singleton() {}
private:
Singleton(const Singleton&) ;
Singleton& 演算子=(const Singleton&) ;
} ; // クラス ConcreteSingleton
class ConcreteSingleton : public Singleton
{
static Singleton* Instance() { static ConcreteSingleton _instance }
; protected:
ConcreteSingleton() {}
} ;
} クライアント コード:
{
名前空間 DesignPattern_Singleton を使用 ;
Singleton *p = ConcreteSingleton::Instance() ;
} 方法 3:
名前空間 DesignPattern_Singleton
{
テンプレート < class T >
class Singleton
{
public:
static T* Instance() { static T _instance return &_instance ; }
protected:
Singleton() {}
private:
Singleton( const Singleton &) ;
Singleton&演算子=(const Singleton&) ;
} ; class ConcreteSingleton : public Singleton< ConcreteSingleton > ;
} クライアントコード
using namespace DesignPattern_Singleton *p = ConcreteSingleton::Instance( ) ;
}
C++ デザイン パターンの Singleton の内容については、PHP 中国語 Web サイト (www.php.cn) をご覧ください。