Singleton.rb
class Singleton
@@uniqueInstance = nil
@count = 0
def self.instance
unless @@uniqueInstance
@@uniqueInstance = new
end
@@uniqueInstance
end
def plus
@count += 1
end
private_class_method :new
end
test/Counter.rb
require '../Singleton.rb'
singleton_one = Singleton.instance
puts singleton_one.object_id
singleton_two = Singleton.instance
puts singleton_two.object_id
singleton_three = Singleton.instance
puts singleton_three.object_id
p singleton_one.plus
p singleton_two.plus
p singleton_three.plus
运行结果:
Singleton.rb:13:in plus': undefined method
+' for nil:NilClass (NoMethodError)
我的想法是:单例模式保证Singleton.instance
获取到的是同一个实例,而count
是实例变量,每次执行xxx.plus
,都会让实例变量count
的值加 1。
可以把@count
改为@@count
,即将实例变量改为类变量,我感觉这样修改并不太好 (只是感觉,也不知道具体是哪里不好)。
问这个问题的本质是想不用内置的 Singleton 来实现单例模式