【问题标题】:Singleton vs. Monostate Pattern in RubyRuby 中的单例模式与单态模式
【发布时间】: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


【解决方案1】:

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

单态强制执行behavior of a singleton without the structure of the monostate。

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

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

【讨论】:

    猜你喜欢
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多