Rubyによるデザインパターンまとめ : singleton
- 作者: Russ Olsen,ラス・オルセン,小林健一,菅野裕,吉野雅人,山岸夢人,小島努
- 出版社/メーカー: ピアソン桐原
- 発売日: 2009/04/01
- メディア: 単行本
- 購入: 13人 クリック: 220回
- この商品を含むブログ (66件) を見る
利用する場面
オブジェクトが複数のインスタンスを生成する必要がなく、そのオブジェクトを唯一存在させたい場合。
サンプル
まずはクラス変数に唯一のインスタンスをもたせて、2つめ以降のインスタンスをつくれなくする方法。
class Fuji attr_reader :height def initialize @height = 3776 end @@instance = self.new def self.instance return @@instance end def erupt p "DOOOOOOOOOOOONNNNN!!!!!!!" end private_class_method :new end p Fuji.instance.height # => 3776 Fuji.instance.erupt # => "DOOOOOOOOOOOONNNNN!!!!!!!"
続いて、Rubyの組み込みモジュールを利用する方法。(構造は上と同じ。)
require 'singleton' class Fuji include Singleton attr_reader :height def initialize @height = 3776 end def erupt p "DOOOOOOOOOOOONNNNN!!!!!!!" end end p Fuji.instance.height # => 3776 Fuji.instance.erupt # => "DOOOOOOOOOOOONNNNN!!!!!!!"
インスタンス自体をつくらず、クラス自体を唯一のオブジェクトとして扱うパターン。
class Fuji @@height = 3776 def self.height @@height end def self.erupt p "DOOOOOOOOOOOONNNNN!!!!!!!" end end p Fuji.height # => 3776 Fuji.erupt # => "DOOOOOOOOOOOONNNNN!!!!!!!"
最後に、moduleを唯一のオブジェクトとして扱うパターン。(moduleだとそもそもインスタンスをつくれないので複数のインスタンスができることを心配しなくてよい。)
module Fuji @@height = 3776 def self.height @@height end def self.erupt p "DOOOOOOOOOOOONNNNN!!!!!!!" end end p Fuji.height # => 3776 Fuji.erupt # => "DOOOOOOOOOOOONNNNN!!!!!!!"
その他
クラス変数にgetterとsetterを持たせたい場合、自前で定義する必要がある。 ただしRailsではclass_attributeなどの組み込みメソッドが用意されている。