##概要
クラスのインスタンスがひとつしか生成されないことを保証し、クラスへのグローバルなアクセス方法を提供するパターン
以下の1種類のクラスからなる
- Singletonクラス(クライアントがアクセスできる唯一のインスタンスである、Instanceオペレーションを定義)
##具体例と実装
施設の鍵を例にすると
上記には
- マスターキークラス
が対応する。
コードの詳細は以下(比較、理解のためマスターキークラスとと通常の鍵クラスを記述)
master_key.rb
class MasterKey
include Singleton
def open(room)
# 必ず鍵を開ける
end
end
room_key.rb
class RoomKey
def initialize(room)
@room = room
end
def open(room)
if room == @room
# 鍵を開ける
else
# 鍵が開かない
end
end
end
##メリット
- クライアントがアクセスするインスタンスをただひとつにすることで、オブジェクトの生成を制御出来る
- グローバル変数を宣言する必要がなくなり、名前空間を減らせる
- 特にポリモーフィズムが絡み、状態をもたないクラス(上記の例では、たとえば、鍵クラスが多態性をもち、様々な部屋に対応した鍵と、必ずどんな部屋でも開けられるマスターキーを定義したいときに、状態を持たないマスターキーをSingletonパターンを使って実装している)を明示的に示す場合に用いると効果的
##まとめ
クラスの生成するインスタンスをただひとつに制限するパターン
あるクラスから生成されるインスタンスを共通で使い回したい場合、クラスが状態を持たない場合を明示したい場合に用いる