Ruby で Singleton

Ruby で Singleton を実装してみる。

モジュールなし

生成したオブジェクトをクラス変数へ保存しておく。

#!/usr/bin/env ruby
class Singleton
  @@instance = nil;

  def initialize
    puts "MyInitialize"
  end

  def self.instance
    @@instance = new if @@instance.nil?
    return @@instance
  end

  private_class_method :new
end

# Entry
a = Singleton::instance
b = Singleton::instance

if a === b
  puts "Singleton"
end

p [a, b]

a = Singleton.new
# 実行結果
$ ruby test.rb
MyInitialize
Singleton
[#, #]
test.rb:24: private method `new' called for Singleton:Class (NoMethodError)

Singleton モジュールを利用する

実装し終わったところで、 singleton パターンを提供するモジュールがあることを知った

#!/usr/bin/env ruby
require 'singleton'

class Single
  include Singleton
end

a = Single.instance
b = Single.instance

if a === b
  puts "Singleton!"
end

p [a,b]
a = Single.new
# 実行結果
Singleton!
[#, #]
test2.rb:17: private method `new' called for Single:Class (NoMethodError)

まとめ

車輪作る前にぐぐりましょう。