在Ruby中,单例模式与单态模式的区别

7
假设一个类需要加载一个外部库,而这个过程需要一些时间,因此应该只加载一次。在这种情况下,两种自然的解决方案是使用单例模式或单态模式。在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 方法加载一个库并防止它被多次加载。 - steenslag
我特别指的是一个非 Ruby 库,不能简单地通过 require 处理,尽管您的建议会指向实现相同目的的第三种方法:class Parser; @@parser = load_external_library; def self.parse(sentence); @@parser.parse(sentence); end; end... 然后在另一个文件中,require 'parser'。这似乎类似于单例模式,但现在用户代码负责仅需要一次性地加载它,这可能比预期更棘手。有什么想法吗? - user2398029
1个回答

4
单例模式从结构上强制确保您在任何时候只能有一个类的实例,开发人员很清楚他们正在处理单例模式。
单态模式强制执行单例行为,但没有单态的结构。
您可能会遇到需要实例数据的情况。因此,使用单态会更好。您可以创建实例,使用方法来影响实例数据,并仍然可以访问静态数据。对于单例模式,您不能拥有实例数据。
另外,如果您计划从单例派生类,并且希望这些类成为单例,则单态是更好的选择。因为所有从单态派生的类都是单态。默认情况下,从单例类继承的类不是单例。您必须为每个派生类添加静态方法和属性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接