在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
模块本身。这样,我们可以在不破坏现有单例行为的情况下添加新的方法和属性。