单例模块儿

2019-04-13 14:49发布

#单例模块,存在的意义就是在模块被载入类时,给类添加类方法和创建对象实例等
module Singleton
#这个方法在模块被载入类时调用,传入的参数是 类对象
def self.included(base)
#这个操作把另一个模块直接添加到Class对象上。类对象上的方法就是类方法。尽管模块中的方法是模块的实例方法。
base.extend(SingletonClass); #让类对象引入另外一个模块:SingletonClass
puts("Singleton Include!");
#创建类的实例,然后把类的new方法设为私有类方法,防止被调用,最后把类的实例存放到类的方法中。
myInstance=base.new(); #实例化
base.private_class_method :new #将该类对象的new方法设置为private,让外部无法访问
base.setClass(myInstance); #这个setClass 方法是SingletonClass模块的实例方法,但是因为base.extend(SingletonClass)将模块直接添加到了Class对象上,即base上,所以这个时候setClass是base这个类对象的实例方法,即是某目标类的类方法。
end
end


#这个模块附加上去的类方法,把类实例保存在模块的实例变量中。也就是目标类的类变量中。
module SingletonClass
def setClass(base)
puts("setClass");
@myClass=base;
return @myClass;
end
#单例方法,仅仅返回类的保护实例变量。
def instance()
puts("instance");
return @myClass;
end
end


class Test
include Singleton;
def say(val)
puts(val);
end
end



test=Test.instance();

test.say("sssssss");

#test=Test.new(); # fail

热门文章