【发布时间】:2012-01-02 07:00:26
【问题描述】:
假设一个类需要加载一个外部库,该库需要一些时间来加载,因此应该只加载一次。对此的两个自然解决方案是使用单例模式或单态模式。在 Ruby 的这个特定上下文中,这两种解决方案有什么优势吗?
例如:
# Using a Singleton class
require 'singleton'
class Parser
include Singleton
def initialize
@parser = load_external_library
end
def parse(sentence)
@parser.parse(sentence)
end
end
# Then calling using...
Parser.instance.parse(sentence)
对比:
# Using a Monostate class
class Parser
def self.parse(sentence)
@@parser ||= load_external_library
@@parser.parse(sentence)
end
end
# Then calling using...
Parser.parse(sentence)
既然第二种语法更简洁,那么在 Ruby 中使用 Singleton 有什么好处吗?
【问题讨论】:
-
require方法加载一个库并防止它被多次加载。 -
我专门指的是一个非 Ruby 库,它不能简单地由 require 处理,尽管您的建议会指向实现相同目标的第三种方法:
class Parser; @@parser = load_external_library; def self.parse(sentence); @@parser.parse(sentence); end; end... 然后在另一个文件,require 'parser'。这似乎类似于单态,但用户代码现在只负责要求它一次,可以是trickier than expected。有什么想法吗?
标签: ruby oop design-patterns singleton monostate