溫馨提示×

Ruby單例模式怎樣確保唯一

小樊
82
2024-11-01 21:04:04
欄目: 編程語言

在Ruby中,單例模式確保一個類只有一個實例,并提供一個全局訪問點。要實現(xiàn)這個模式,你可以使用以下方法之一:

方法1:使用class變量

class Singleton
  @@instance = nil

  def self.instance
    return @@instance if @@instance
    @@instance = new
  end

  def initialize
    # 初始化代碼
  end
end

方法2:使用模塊

module Singleton
  def self.included(base)
    base.class_eval do
      @instance = nil

      def self.instance
        return @instance if @instance
        @instance = new
      end

      def initialize(*args, &block)
        super
      end
    end
  end
end

方法3:使用define_method

class Singleton
  def self.instance
    @instance ||= new
  end

  def self.new(*args, &block)
    raise "Instance already created" if @instance
    super
  end

  def initialize
    # 初始化代碼
  end
end

這些方法都可以確保一個類只有一個實例。當(dāng)你需要訪問這個實例時,只需調(diào)用Singleton.instance即可。請注意,這些方法在多線程環(huán)境下可能不是線程安全的。為了確保線程安全,你可以使用MutexThread.new來實現(xiàn)。例如:

class Singleton
  def self.instance
    @instance ||= Mutex.new.synchronize { new }
  end

  def self.new(*args, &block)
    raise "Instance already created" if @instance
    super
  end

  def initialize
    # 初始化代碼
  end
end

0