Ruby中的Singleton vs. Monostate模式

时间:2012-01-02 07:00:26

标签: ruby oop design-patterns singleton monostate

假设一个类需要加载一个外部库,这需要一些时间来加载,因此只应加载一次。对此的两个自然解决方案是使用单例模式或单稳态模式。在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有什么好处吗?

1 个答案:

答案 0 :(得分:4)

单例模式在结构上强制执行您可以never have more than one instance of a class at a time的事实,并且开发人员明白他们正在处理单例。

monostate执行behavior of a singleton without the structure of the monostate

您可能会发现仍需要实例数据的情况。因此,单稳态会更好。您可以创建实例,使用方法来影响实例数据,并且仍然可以访问静态数据。使用单例,您不能拥有实例数据。

此外,如果您计划从单身人士派生类,并且您希望这些课程是单身人士,那么您更好的选择是单一的。那是因为从monostate派生的所有类都是单独的。默认情况下,类派生的单例类不是单例。您必须将静态方法和属性添加到每个派生类。