在Ruby中实现Singleton模式

bra*_*yne 0 ruby oop singleton design-patterns ruby-on-rails

虽然我已经将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
Run Code Online (Sandbox Code Playgroud)

控制器代码:

class PagesController < ApplicationController
  def home
    @foo = FooFactory.instance.get_foo
  end
end
Run Code Online (Sandbox Code Playgroud)

视图代码:

<%= @foo %>
Run Code Online (Sandbox Code Playgroud)

我希望在第一次实例化之后应该返回该print方法.但每次刷新视图时,控制台都会继续打印.FooFactoryfalseFooFactorytruepages/home

Rob*_*vis 6

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

config.cache_classes = false
Run Code Online (Sandbox Code Playgroud)

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

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