是否有合适的方法将服务注入单身人士?

时间:2016-11-02 13:50:00

标签: ruby singleton

更新

我现在要留下这个问题,因为这样的事情可能会或可能没有有效的用例。对于我的情况,这是一个设计问题,而不是使用Singleton,我找到了一个自然的位置来创建一个普通对象的实例,并传递对它的引用是必要的。由于它现在是一个普通的对象,我可以再次使用构造函数注入。

原始问题

我认为我认为适当使用Singleton。它是一个懒惰地加载文件夹和文件类型的图像,以便在JRubySWT应用程序中使用。

该课程将如下所示。这些方法需要一个Display实例来创建图像。

问题是,注入Display对象的原因是什么?为什么? 如果Display不可用,我正在考虑使用begin ... rescue块将@display的值设置为nil,然后为单元测试提供setter。

当我认为我需要一个Singleton时,我总是想知道我做错了什么,当我需要用Singleton做一些不寻常的事情时更是如此,所以我不会排除其他选择。

require "singleton"

class FileSystemIcons
  include Singleton

  attr_accessor :display, :cached_folder_image, :cached_file_images

  def initialize 
    @display = Display.display
    @cached_folder_image = nil
    @cached_file_images = {}
  end

  def folder_image
    unless cached_folder_image
      ...
      self.cached_folder_image = converted_image
    end
    cached_folder_image
  end

  def file_image file_name
    ...
    unless cached_file_images[ext]
      ...
      cached_file_images[ext]
    end
  end

 end

1 个答案:

答案 0 :(得分:0)

我个人更喜欢构造函数注入,无论对象是否是单例。这确保了创建后完全初始化的对象。因此,bar的处理也应该是构造函数的一部分。

Display.display.nil?