ruby - Ruby 中的单例模式与单态模式

标签 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 有什么优势吗?

最佳答案

单例模式在结构上强化了这样一个事实,即您可以 never have more than one instance of a class at a time ,对于开发人员来说很明显他们正在处理单例。

单一国家执行 behavior of a singleton without the structure of the monostate .

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

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

关于ruby - Ruby 中的单例模式与单态模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8698247/

相关文章:

ruby - Ruby 的字符串文字并置功能的正式记录在哪里?

ruby - 在 Ruby 中搜索元音

ruby-on-rails - 数组评估为零

php - 如何编写我自己的克隆函数

go - 池模式和原型(prototype)模式有什么区别?

ruby - ssh 代理脚本在 ruby​​ 中运行但不在 jruby 中运行

class - 使用自动生成的公共(public)属性方法与创建访问私有(private)属性的方法

excel - 如何改进这个类模块定义

java - 如何在 X 类工厂中声明方法,以便其子工厂可以使用子类 Class-1 常量?

java - 我该如何改进这段代码?