投稿者:https://www.cnblogs.com/zhili/p/SingletonPatterm.html
I.はじめに
学習プロセスでも、私の研究ノートのいくつかを記録するために、ここでは、デザインパターンにブログの庭の多くの記事を参照しながら、最近のデザインパターンのいくつかの要素、主要参考書は、「ヘッドファーストデザインパターン」で、まず、私のデザインパターン、および第二のより良い理解を助けるために、同時に友人に初心者のいくつかのいくつかのリファレンス・デザイン・パターンを与えることができます。(クラスのみが関与があるので)シングルトン - まず、私は比較的単純なパターンのデザインパターンを紹介します
はじめに第二に、シングルトン
シングルトンを言えば、我々は最初の反応があるはずです-シングルトンが何でありますか?Singletonパターンがあるので、クラスの唯一のインスタンス- 「シングルトン」から文字通りとして理解クラスのインスタンスが1つだけA方式ベール(実際にはデザインパターンは、私たちは実際の開発プロセスを解決するのに役立つことを保証するために、 )である方法は、オブジェクト間の結合度を減らすために、多くのソリューションがありますが、先人たちが本のためのいくつかの一般的なソリューションを要約するようなので、この本はデザインパターンと呼ばれ、以下に示しますシングルトンパターンの公式な定義:クラスのインスタンスを1つだけ確実に、そしてグローバルなアクセスポイントを提供します。より良いシングルトンの理解を助けるために、我々は感謝して、単一の実施形態のアイデアを実現するために、後に分析されます以下のクラス図に特異的に結合することができます。
第三に、なぜシングルトンがあります
なぜべきSingletonパターン - シングルトン紹介を読んだ後、自然に私たちは、このような疑問を持っているのだろうか?それは、どのような状況で使用されていますか?私たちが見ることができるシングルトンパターンの定義 - NATURALシングルモードの実施例我々のシステムは、そのオブジェクトが場合、例えばのほんの一例必要とするときに1つのだけのオペレーティングシステムのタスクマネージャ、ファイル操作を同じ時間にその動作のインスタンスを1つだけ許可する場合、このような現実のシナリオがあるので(ソフトウェアデザインは、実際の生活の中であるため、抽象的)、自然にソフトウェア設計の分野では、このような解決策がなければならないので、シングルトンパターンが存在します。
第四に、アイデアの実現シングルトンの分析
シングルトンの基本的な概念のいくつかの上に理解した後、自分の学習シングルトンで、シングルトンパターンを実装するコードで簡単に見は確かに非常に簡単ですので、シングルケースモデルを分析するすべての人のためのアイデアの実現以下、理解しやすいですが、私はまだそれは非常に奇妙だと思う(これもあまり理由を使用している以下を見て、または独自のコードを記述することができる)が、私の心は常に、このような質問がされます - なぜそれがそう前任者を行きますシングルトンパターンは、それを達成するには?彼らはどのようにそれを思いましたか?彼のアイデアの後ろに熟考した後、ゆっくりと明確なシングルトンパターンを達成するための根拠、そして今回はプロセスの私の分析を共有するために、ここで、シングルトンは不慣れだと思うもはやありません。
概念的我々シングルトン(クラスのインスタンスを1つだけ確認し、それがグローバル・アクセス・ポイントへのアクセスを提供するために)開始する、概念は2つの部分に分割することができる:(1)クラスのインスタンスを1つだけ確保、(2)それにアクセスするためのグローバルアクセスポイントを提供し、あなたはすぐに対話の2を使用して、アイデアの分析を習得するには、次
ルーキー:クラスのインスタンスを1つだけ確実にするためにどのように?
多く:次に私は、あなたはそれが何で作成する方法を考えますクラスのインスタンスを作成し、分析ダウンのお手伝いをしましょうか?
初心者:新しいキーワードとああ、限り、次のクラスの新しいインスタンスを作成し、あなたがクラスとインスタンスメソッドの属性の一部を使用することができるよう
戦没者:あなたは、クラスのインスタンスを作成するために、新しいキーワードを使用することができますなぜあなたは今まで疑問に思って?
ルーキー:条件はありますか?.........ああ、クラス定義のプライベートコンストラクタは注意してください(外の世界で新しいインスタンスを作成することができない場合、私は、それを考える:一部の初心者が聞いてきます、と時々私はクラスではありませんでしたまた、新しいオブジェクトを作成するために使用することができるのはなぜコンストラクタを定義し、それは我々が、コンパイラは、クラスのコンストラクタを定義していないことを確認したときに改ざん後ろコンパイラは、と、コンパイラは、私たちは公共のノーを生成するのに役立ちますのでです引数のコンストラクタ)
戦没者:はい、右のそれに答える、あなたの疑問を答えてくれるように、ああ
ルーキー:私はどこにクラスのインスタンスを作成したいですか?
戦没者:あなたは愚かなああ、もちろん、注意してください(内部クラスを作成することです。これは自然にそうそこにインスタンスを保持する変数があるはず、インスタンスを作成するために、上記のプロセスを考えたプライベートコンストラクタの定義ですプライベート変数を宣言し、友人がについて考えていませんが、実装は、静的変数、民間の定義である-それは解釈のこの質問のために、ここで静的として定義なぜです:各スレッドは、静的として定義され、独自のスレッドスタックを持っていますか?主クラスはマルチスレッドの例を持っていることを確実にするため)
ルーキー:ああ、今完全に理解し、私は別の質問を持っている - 今、クラス内のクラスのインスタンスの作成は、どのようにそれを使用するために外の世界のインスタンスを取得するには?
戦没者:さて、あなたはクラスのパブリック・インスタンスを出すために、パブリックメソッドやプロパティを定義することができます(注:これは、パブリックメソッドの定義を持つことになります、メソッドがクラスメソッドを依頼するグローバルアクセスポイントを提供することです)
上記の分析を通じて、我々は(!:これは本当です、それを読んだ後、あなたは驚かれることでしょう)、それはシングルトンパターンを実装するコードを書くのは簡単で、次のように特定の実装コードを見ていきますと考えています。
/// <要約> シングルトン///実装 /// </要約> パブリッククラスシングルトン { //静的クラスのインスタンス変数の定義を保持する シングルトン静的uniqueInstanceプライベート; //プライベートコンストラクタが定義され、その結果外部このような場合は作成できない プライベート・シングルトン() { } /// <要約> ///方法は、公衆アクセスポイントのグローバルな定義を提供するために、そしてあなたがアクセスポイントを提供するために、グローバルパブリックプロパティを定義することができ /// </要約> // / <リターン> </戻り> パブリック静的でGetInstanceシングルトンは、() { クラスのインスタンスは、それが作成され存在しない場合//そうでない場合は戻り直接 IF(uniqueInstance == NULL) { uniqueInstanceシングルトン新しい新=(); } uniqueInstanceを返します。 } }
上記シングルスレッドマルチスレッドシングルトンの複数のインスタンスする場所同時にGetInstanceメソッドを実行している2つのスレッド、及び2つのスレッドが判定された場合のように、場合に、但し、完全実際(uniqueInstance例シングルモード= = nullの)その後、実行上記の実装以来、複数の実行スレッド、この条件が真であり、2つのスレッドがシングルトンのインスタンスを作成しますシングルトンパターンの私達の本来の意図に反してそう返す、我々は、マルチスレッド化のためのものですでGetInstance自然な解決策は一つだけのスレッドがうまく実行されている同じ時間実行時にメソッドを作ることです(スレッド同期のためにあなたが私を参照することができるが、我々は同期のスレッド質問である、スレッドの同期マルチスレッド解決するための具体的なコードは、以下、記事の) :
/// <要約> シングルトン///実装 /// </要約> パブリッククラスシングルトン { //静的クラスのインスタンスを保持する変数の定義 プライベート静的uniqueInstanceシングルトン; //スレッド同期識別の定義 プライベート読み取り専用=オブジェクトロッカー新しい新しい静的オブジェクト(); クラスのインスタンスで定義されている//プライベートコンストラクタは、外部で作成することができない プライベートシングルトン() { } /// <概要> 公衆アクセスポイントのグローバル定義を提供するために、///方法を、そしてあなたパブリックプロパティは、グローバルアクセスポイントを提供するために定義することができ /// </要約> </戻り値> /// <戻り値>は パブリック静的でGetInstanceはシングルトン() { //この時、ここで実行している最初のスレッドは、意志ロッカーオブジェクト「ロック」 //場合の方法を実行する第二のスレッド、最初に検出ロッカーオブジェクトは状態を「ロック」され、スレッドがロックを解除する最初のスレッドを待ってハングアップします ロックステートメント(糸が切れた後つまり、)実行した後//オブジェクトは、「アンロック」であろう ロック(ロッカー)は { クラスのインスタンスは、それが作成され存在しない場合//そうでない場合は戻り直接 IF(uniqueInstance == NULL) { uniqueInstanceシングルトン新しい新=(); } } uniqueInstanceを返します; } }
このソリューションは、実際にマルチスレッドの問題が、解決することができる上に、別の裁判官の後のスレッドロッカーロックヘルパーオブジェクトが存在する場合、各スレッドのインスタンスに対して上記のコードをスレッドが作成されると、この操作は不要であり、ときに最初クラスのインスタンスの後に、スレッドの背後にあるこの時間はちょうど判決(uniqueInstance == null)を指示する必要があるオブジェクトのロックスレッド補助裁判官の後に行くためにはfalse、そして絶対に必要ではありませんので、上記の実装では、追加の追加費用、性能の低下は、上記欠陥の実装を改善するために、我々は唯一の"ロック文の前で増加したオーバーヘッドをロックし、この実装は、我々はそれを呼び出すに回避することができる(uniqueInstance == null)の判決を追加する必要がありますダブルロック"は、次のコードでは、特定の外観を達成するために:
/// <要約> シングルトン///実装 /// </要約> パブリッククラスシングルトン { //静的クラスのインスタンスを保持する変数の定義 プライベート静的uniqueInstanceシングルトン; //スレッド同期識別の定義 プライベート読み取り専用=オブジェクトロッカー新しい新しい静的オブジェクト(); クラスのインスタンスで定義されている//プライベートコンストラクタは、外部で作成することができない プライベートシングルトン() { } /// <概要> 公衆アクセスポイントのグローバル定義を提供するために、///方法を、そしてあなたパブリックプロパティは、グローバルアクセスポイントを提供するために定義することができ /// </要約> </戻り値> /// <戻り値>は パブリック静的でGetInstanceはシングルトン() { //この時、ここで実行している最初のスレッドは、意志ロッカーオブジェクト「ロック」 方法を実行して第二のスレッドは、オブジェクトが最初にロッカー「ロック」状態を検出した場合//、最初のスレッドを待ってハングするスレッドがロックを解除する ロックステートメント(糸が切れた後つまり、)実行した後//オブジェクトは、「ロック解除」になります ちょうどそれの判定//ダブルロック 場合(uniqueInstanceは== NULL) { ロック(ロッカー) { //インスタンスが作成されたクラスが存在しない場合、または直接リターン ==(uniqueInstance場合NULL) { uniqueInstanceシングルトン新しい新=(); } } } uniqueInstanceを返します; } }
ファイブは、C#クラスは、単一の実施の形態で実装されています
シングルトン上で理解した後、新人は頼むようになった:.NET Frameworkのライブラリーは、シングルトンを実装していませんか?
表示されたら、.NETクラスライブラリは、シングルモードの実施形態を実現するために存在しないが、クラスは、次の特定の実装クラスを見て(クラスSystem.dllの組み立てに特異的に存在する、名前空間開示されていませんシステム、あなたは)ソースコードを表示するために反射ツールリフレクタを使用することができます。
//クラスは、クラス開示されていない このクラスの//実装が、単一モードの実施形態を使用 内部はSRクラス密閉 { プライベート静的SR Loaderを、 内部SR() { } クラスではないので、//主に公共のようにフルアクセスポイントは、プライベートとして定義されている @心はまだシングルトンのアイデアに使用されている プライベート静的GetLoader SR() { IF(ローダ== NULL) { SR新しい新しいSR = SR(); Interlocked.CompareExchange <SR>(ローダREFは、SR)、NULL; } ローダを返す; } //この方法は、公開GetLoaderメソッド呼び出し )のGetObject(文字列名のパブリック静的オブジェクトを { SRローダ= GetLoader()。 IF(ローダ== NULL) { 戻りヌル。 } loader.resources.GetObject(名前、文化)を返します。 } }
VIの概要
ここでは後に、導入上のシングルトンデザインパターンが終わって、私たちは、この記事を通じて、我々はSingletonパターンのより深い理解を持つことができることを願って、そしてシングルトンSingletonパターンの前には接触したくないか、奇妙な友人が見ているだろうと感じ叫んだ:私は参照してください!