ようこそ。睡眠不足なプログラマのチラ裏です。

デザインパターン第7回「Singletonパターン その1」

デザインパターン第14回「Singletonパターン」その2はこちらです。


毎度恒例となりました、独りよがりなデザパタ講座。
今回はGoFデザインパターンの中から「Singletonパターン」をぬるーく解説します。


これは、一言で言うと、「1度作った1つのインスタンスを使いまわすパターン」です。
主に、インスタンスが複数あっては困る場合や、1つあれば事足りるという場合に利用されます。
必要もないのに多くのインスタンスを作るのは、メモリと時間の無駄遣いですからね^^
まあ、パターンというよりはむしろ、一種のオブジェクト指向の設計テクニックとかイディオム的な側面が強いです。


■Singletonパターンの概要■

プロセス内に、オブジェクトが一つしか存在しないことを保証し、
そのインスタンスにアクセスするためのグローバルな方法を提供するパターンです。
このパターンでは、コンストラクタを隠蔽化することによって、
自身の生成を自身の責任のもとで制御します。コンストラクタを隠蔽することによって、
クライアントは、自由にインスタンス化できなくなるため、インスタンスのユニーク性が保証されます。


GoFの定義では、複数のインスタンスを持つSingletonについても言及している。
Singletonなだけに基本は1つとするが、制限を設けて増やしてもかまわないとある。
Singletonパターンは、インスタンス数を制限するパターンであり、
別段1つに制限することに限った話ではないというわけだ。


Singletonパターンを利用するにあたって

Singletonパターンはその簡単な構造とは裏腹に、インスタンスに対するアクセスを制限し、
且つインスタンス化できる数を任意に制限することができ、実用性は高い。


例えば、生成にかかわるパターンのAbstract Factoryパターンなどでは
アプリケーション内でインスタンスが複数必要となることは稀で、
且つ高いアクセシビリティを要するので、Singletonパターンを用いて実装される事が多いだろう。
しかし、Singletonパターンは、拡張されたグローバル変数という側面も合わせ持つので、
グローバル変数が持つ欠点は、多くの場合 Singletonパターンにも当てはまる点には注意が必要です。



Singletonパターンの実装について

まず、Singletonにしたいクラスを静的なクラスフィールドとして用意します。
これによって生成されたオブジェクトはグローバル領域で管理され、どこからでも参照可能です。
次に、privateなコンストラクタを定義し、これによってSingletonクラス以外からコンストラクタの呼出しを制限します。
コンストラクタの呼出しを制限したことによって、外部からインスタンス化ができないので、
外部からインスタンスを取得するためのGetInstanceメソッドを用意してあげる必要があります。
このメソッドは、どこからでも参照できる必要があるので、public static(Public Shared)で宣言する必要があります。
GetInstanceメソッドでは、静的クラスフィールドがnull(Nothing)であれば、自身をインスタンス化し、返します。
静的クラスフィールドに既に参照がある場合は、そのフィールドを返します。
つまり、可視性の設定がこのパターンを実現するためのミソというわけですな。



要は、既に作ったことがあればそれを渡し、一度も作ってなければ、新たに作ってからそれを渡すってことです。
細かいことに関しては、オマケを参照ということで。これでおしマイケル(´・ω・`)


オマケ
Singletonパターン - VB.NET - 雑なサンプルソース