在Ruby中,單例模式可以通過使用模塊和類變量來實現。為了使單例模式可擴展,我們可以設計一個靈活的結構,允許在不修改原始單例類的情況下添加新的功能。以下是一個可擴展的單例模式設計示例:
# 單例模塊
module Singleton
def self.included(base)
base.class_eval do
@instance = nil
def self.instance
@instance ||= new
end
def self.new(*args, &block)
raise "Use #instance method to get the single instance of #{base}"
end
end
end
end
# 使用單例模塊的示例類
class MyClass
include Singleton
def initialize(name)
@name = name
end
def say_hello
puts "Hello, my name is #{@name}!"
end
end
# 創建單例實例
my_instance = MyClass.instance
my_instance.say_hello # 輸出: Hello, my name is MyClass!
# 擴展單例類
class MyClassWithExtension < MyClass
def say_goodbye
puts "Goodbye, my name is #{@name}!"
end
end
# 使用擴展后的單例實例
extended_instance = MyClassWithExtension.instance
extended_instance.say_hello # 輸出: Hello, my name is MyClass!
extended_instance.say_goodbye # 輸出: Goodbye, my name is MyClass!
在這個設計中,我們使用了一個名為Singleton
的模塊來實現單例模式。這個模塊包含一個included
方法,它會在被包含的類中注入一個類變量@instance
和一個instance
方法。instance
方法用于獲取唯一的實例,而new
方法則用于引發一個異常,以防止直接調用它來創建新的實例。
通過將Singleton
模塊包含在需要單例的類中,我們可以輕松地擴展這個類,而無需修改Singleton
模塊本身。這樣,我們可以在不破壞現有單例行為的情況下添加新的方法和屬性。