当我想实现一个 (暂不考虑并发性) 单例模式的类时:
class Singleton
private_class_method :new,:dup,:clone
def self.instance
@@single ||= new
end
end
这时候我再用两个类去继承
class Config < Singleton
end
class Database < Singleton
end
p Config.instance # => #<Config:0x0000000102a9eef0>
p Database.instance # => #<Config:0x0000000102a9eef0>
p Config.instance.equal? Database.instance # => true
当我执行两个继承类各自的.instance
方法时,返回了同一个对象,这里我的理解是:
Config.instance
时,找的Singleton.instance
并首次初始化类变量@@single
,这里的类变量归属Singleton
,而@@single
是Config
的一个实例。Database.instance
时,也执行到了Singleton.instance
,由于@@single
已经被赋值了,所以返回。但这里我希望的是Config.instance
和Database.instance
各自返回的是各自的实例,所以将@@single
改为@single
,最终结果确实没问题:
class Singleton
private_class_method :new,:dup,:clone
def self.instance
@single ||= new
end
end
class Config < Singleton
end
class Database < Singleton
end
p Config.instance # => #<Config:0x0000000100c8d5b0>
p Database.instance # => #<Database:0x0000000100c8cae8>
p Config.instance.equal? Database.instance # => false
但是我搞不明白,为什么变为实例变量@single
时,结果发生了变化,@single
是Singleton
这个对象的实例变量,而这个Singleton
这个类对象应该是唯一的,但结果是不同的?想请教一下