在Ruby中实现Singleton模式

时间:2011-06-26 22:49:36

标签: ruby-on-rails ruby oop design-patterns singleton

虽然我已将FooFactory类声明为“Singleton”,但每次都会对其类变量@@ foo进行实例化。为什么会这样?

主要的单身人士课程:

require 'singleton'

class FooFactory
  include Singleton
  @@foo = nil

  def get_foo
    print @@foo.nil?.to_s
    @@foo  ||= "I am a string"
    return @@foo
  end
end

控制器代码:

class PagesController < ApplicationController
  def home
    @foo = FooFactory.instance.get_foo
  end
end

观看代码:

<%= @foo %>

我希望print中的FooFactory方法在第一次实例化false后应返回FooFactory。但每次刷新true视图时,控制台都会继续打印pages/home

1 个答案:

答案 0 :(得分:6)

在开发模式下,每次请求都会重新加载类,从而丢失可能填入其中的任何类状态。这可以通过在development.rb中查找这一行来改变:

config.cache_classes = false

并将其更改为true,这通常是在production.rb中设置的。将其设置为false的原因很方便:您可以编辑代码并点击刷新以查看更改,而无需重新启动服务器。

但是在Rails中,将状态放入类并期望它保持在请求之间并不常见,因为虚拟机来来往往,并且线程化的VM可能无法以线程安全的方式访问类状态。有这些问题的解决方法,但通常有更好的方法来做你正在做的事情。