Tbpgr Blog

Ruby プログラマ tbpgr(てぃーびー) のブログ

RubyでSingletonパターン

概要

GoFデザインパターンのSingletonパターンについて。
インスタンスがひとつであることを保証するのがSingletonパターン。

登場人物

Singleton = シングルトン

UML


実装サンプル

サンプル概要

あるサイトのアクティブユーザーを管理するクラスを実装したいとします。
このアクティブユーザーの管理をSingletonで行います。

登場人物

Singleton = active_user.rb:一意なアクティブユーザー数を管理するクラス
main = 動作確認用メイン処理

サンプルコード

active_user.rb

# encoding: Shift_JIS

=begin rdoc
= ActiveUserクラス
=end
class ActiveUser
  @@active_user = nil
  attr_accessor :acrive_user_count
  
  def self.instance
    return @@active_user if @@active_user
    @@active_user=new
  end

  private_class_method:new
  def initialize
    @acrive_user_count=0
  end
end

main.rb

# encoding: Shift_JIS
require_relative './active_user'
require_relative './active_user2'

a = ActiveUser.instance
b = ActiveUser.instance

a.acrive_user_count += 1
p a.acrive_user_count
b.acrive_user_count += 1
p b.acrive_user_count
出力
1
2

補足

Rubyはシングルトンをサポートしているため、実際には以下のコードで問題ない
active_user2.rb

# encoding: Shift_JIS
require 'singleton'

=begin rdoc
= ActiveUserクラス
=end
class ActiveUser2
  include Singleton
  attr_accessor :acrive_user_count
  
  def initialize
    @acrive_user_count=0
  end
end

main.rb

c = ActiveUser2.instance
d = ActiveUser2.instance

c.acrive_user_count += 1
p c.acrive_user_count
d.acrive_user_count += 1
p d.acrive_user_count

出力

1
2