在工厂中动态注册类

时间:2014-01-09 02:20:14

标签: ruby-on-rails ruby factory

我目前正在努力实现类似于此问题所选答案中提议的内容:Ruby design pattern: How to make an extensible factory class?

class LogFileReader

@@subclasses = { }
  def self.create type
    c = @@subclasses[type]
    if c
      c.new
    else
      raise "Bad log file type: #{type}"
    end
  end
  def self.register_reader name
    @@subclasses[name] = self
  end
end

class GitLogFileReader < LogFileReader
  def display
    puts "I'm a git log file reader!"
  end
  register_reader :git
end

class BzrLogFileReader < LogFileReader
  def display
    puts "A bzr log file reader..."
  end
  register_reader :bzr
end

LogFileReader.create(:git).display
LogFileReader.create(:bzr).display

class SvnLogFileReader < LogFileReader
  def display
    puts "Subersion reader, at your service."
  end
  register_reader :svn
end

LogFileReader.create(:svn).display

单元测试工作完美无缺,但是当我启动服务器时,没有注册任何课程。我可能会遗漏一些静态方法调用是如何工作的?每个子类进行register_reader调用的时间是什么时候?

1 个答案:

答案 0 :(得分:0)

要回答OP关于类何时调用register_reader的问题,该问题在文件加载时发生。将此代码添加到初始化程序中以自己加载文件。

Dir[Rails.root.join('path', 'to', 'log_file_readers', '**', '*.rb').to_s].each { |log_file_reader| require log_file_reader }