
オブジェクト指向プログラミングにおいて、シングルトンパターンは、クラスのインスタンス化を単一のインスタンスに制限するソフトウェア設計パターンです。オブジェクト指向ソフトウェアで繰り返し発生する問題を解決する方法を説明する、よく知られた「Gang of Four」設計パターンの 1 つです。 [1]このパターンは、システム全体のアクションを調整するために 1 つのオブジェクトだけが必要な場合に役立ちます。
具体的には、シングルトンパターンによりクラスは次のことが可能になります。[2]
この用語は、シングルトンという数学的概念に由来します。
一般的な用途
シングルトンはグローバル名前空間(またはそれを含む名前空間)を汚染しないため、グローバル変数よりも好まれることが多い。さらに、多くの言語のグローバル変数は常にリソースを消費するのに対し、シングルトンは遅延割り当てと初期化を可能にする。[1] [3]
シングルトン パターンは、抽象ファクトリ、ファクトリ メソッド、ビルダー、プロトタイプパターンなどの他の設計パターンの基礎としても使用できます。必要なファサード オブジェクトは 1 つだけなので、 ファサードオブジェクトもシングルトンになることがよくあります。
ロギングはシングルトンの一般的な実世界の使用例です。これは、メッセージをログに記録するすべてのオブジェクトが統一されたアクセスポイントを必要とし、概念的には単一のソースに書き込むためです。[4]
実装
シングルトン パターンの実装により、シングルトン クラスのインスタンスが 1 つだけ存在することが保証され、通常はそのインスタンスへのグローバル アクセスが提供されます。
通常、これは次のように実現されます。
インスタンスは通常、プライベートな静的変数として保存されます。インスタンスは、静的メソッドが最初に呼び出される前のある時点で変数が初期化されたときに作成されます。
この C++11 実装は、書籍[引用が必要]の C++98 以前の実装に基づいています。
#include <iostream>
class Singleton { public : // クライアントが一意のインスタンスにアクセスできるようにするクラス操作を定義します。static Singleton & get () { // 独自の一意のインスタンスを作成する責任を負う場合があります。if ( nullptr == instance ) instance = new Singleton ; return * instance ; } Singleton ( const Singleton & ) = delete ; // 3 つのルールSingleton & operator = ( const Singleton & ) = delete ; static void destruct () { delete instance ; instance = nullptr ; } // 既存のインターフェイスがここにありますint getValue () { return value ; } void setValue ( int value_ ) { value = value_ ; } private : Singleton () = default ; // パブリック コンストラクターなし~ Singleton () = default ; // パブリック デストラクタなしstatic Singleton * instance ; // クラス変数の宣言int value ; };
シングルトン*シングルトン::インスタンス= nullptr ; // クラス変数の定義
int main () {シングルトン:: get () 。setValue ( 42 ); std :: cout << "value=" <<シングルトン:: get () 。getValue () << '\n' ;シングルトン:: destruct (); }
プログラムの出力は
値= 42
これはC++11でのMeyersシングルトン[5]の実装です。Meyersシングルトンにはdestructメソッドがありません。プログラムの出力は上記と同じです。
#include <iostream>
クラスSingleton { public : static Singleton & get () { static Singleton instance ; return instance ; } int getValue () { return value ; } void setValue ( int value_ ) { value = value_ ; } private : Singleton () = default ; ~ Singleton () = default ; int value ; };
int main () {シングルトン:: get () 。setValue ( 42 ); std :: cout << "value=" <<シングルトン:: get () 。getValue () << '\n' ; }
遅延初期化
シングルトン実装では、静的メソッドが最初に呼び出されたときにインスタンスが作成される遅延初期化を使用する場合があります。マルチスレッドプログラムでは、これにより競合状態が発生し、複数のインスタンスが作成されることがあります。次のJava 5+の例[6]は、二重チェックロックによる遅延初期化を使用したスレッドセーフな実装です。
パブリッククラスシングルトン{
プライベート静的揮発性シングルトンインスタンス= null ;
プライベートシングルトン() {}
パブリック静的シングルトンgetInstance () { if (インスタンス== null ) { synchronized (シングルトン. class ) { if (インスタンス== null ) { instance = new Singleton (); } } }インスタンスを返します; } }
批判
シングルトンは、多くの場合不必要にアプリケーションにグローバル状態を導入するアンチパターンであると考える人もいます。これにより、他のオブジェクトによるシングルトンへの潜在的な依存関係が導入され、依存関係が実際に存在するかどうかを判断するために実装の詳細を分析する必要があります。 [7]この結合の増加により、ユニットテストが困難になる可能性があります。[8]これにより、複数のインスタンスの同時使用が禁止されるなど、シングルトンを使用する抽象化に制限が課せられます。[8] [9] [10]
シングルトンは、通常の機能を実行するだけでなく、自身の一意性を強制する責任があるため、単一責任の原則にも違反します。 [8]
参照
参考文献
- ^ ab Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides (1994)。デザインパターン: 再利用可能なオブジェクト指向ソフトウェアの要素。Addison Wesley。pp. 127ff。ISBN 0-201-63361-2。
{{cite book}}: CS1 maint: 複数の名前: 著者リスト (リンク) - ^ 「シングルトン デザイン パターン - 問題、解決法、適用性」。w3sDesign.com。2017年 8 月 16 日閲覧。
- ^ Soni, Devin (2019 年 7 月 31 日). 「シングルトンとは何か?」. BetterProgramming . 2021 年8 月 28 日閲覧。
- ^ Rainsberger, JB (2001年7月1日). 「シングルトンを賢く使う」. IBM. 2021年2月24日時点のオリジナルよりアーカイブ。2021年8月28日閲覧。
- ^ Scott Meyers (1997). More Effective C++ . Addison Wesley. pp. 146 ff. ISBN 0-201-63371-X。
- ^ Eric Freeman、Elisabeth Freeman、Kathy Sierra、Bert Bates (2004 年 10 月)。「5: One of a Kind Objects: The Singleton Pattern」。Head First Design Patterns (初版)。O'Reilly Media, Inc.、p. 182。ISBN 978-0-596-00712-6。
{{cite book}}: CS1 maint: 複数の名前: 著者リスト (リンク) - ^ “シングルトンが物議を醸す理由”. Google Code Archive . 2021年5月6日時点のオリジナルよりアーカイブ。2021年8月28日閲覧。
- ^ スティーブ・イェッジ。独身者は愚か者とみなされる、2004年9月
- ^ Hevery, Miško、「グローバル状態とシングルトン」、Clean Code Talks、2008 年 11 月 21 日。
外部リンク
- 完全な記事「Java シングルトン パターンの説明」
- Java でシングルトンを実装する 4 つの方法 「Java でシングルトンを実装する方法」
- 本の抜粋: C# でのシングルトン パターンの実装 (Jon Skeet 著)
- Microsoft パターン & プラクティス デベロッパー センターのシングルトン
- IBM の記事「ダブルチェック ロックとシングルトン パターン」(Peter Haggar 著)
- Geary, David (2003 年 4 月 25 日)。「一見単純なシングルトン パターンをナビゲートする方法」。Java デザイン パターン。JavaWorld。2020年7 月 21 日閲覧。
- Google シングルトン検出器 ( Java バイトコードを分析してシングルトンを検出します)
