单例singleton,是所有设计模式中最简单的,但又是问题最多的。其实并不简单,一定要慎用。
singleton,和全局变量很相似,所以要尽量的不用它,问题也就不会出来。而不是我们常常说的那样这个我们可以用
singleton来实现。不出问题的唯一方法就是:别那么做。
如果要使用了,在使用之前必须知道你要做的东西是否必须要用他来实现,还有就是要进行严密的测试。这样说是有
事实依据的,我们现在跑了三四年的程序中就有好几个地方用到的,在这期间发生了很多问题都和它有关。其中一个问题是
想写一个singleton,但是没有安装标注去写,也没有严密的测试,结果造成了非常严重的后果。
下面是ruby实现singleton一些方法。大家多提意见。
#
# one
#
class SimpleLogger
attr_accessor :level
ERROR = 1
WARNING = 2
INFO = 3
def initialize
@log = File.open("log.txt","w+")
@level = WARNING
end
def error(msg)
@log.puts("ERROR:" + msg)
@log.flush
end
def warning(msg)
@log.puts("WARNING:" + msg) if @level >= WARNING
@log.flush
end
def info(msg)
@log.puts("INFO:" + msg) if @level >= INFO
@log.flush
end
#
# 创建单例模式,需要将这些方法放在initialize方法之后,要记住ruby是动态的
#
@@instance = SimpleLogger.new
def self.instance
return @@instance
end
private_class_method :new
end
logger1 = SimpleLogger.instance
logger2 = SimpleLogger.instance
SimpleLogger.instance.info('Computer wins chess game1')
SimpleLogger.instance.warning('Computer wins chess game2')
#
# two
#
require 'singleton'
class SimpleLogger2
include Singleton
attr_accessor :level
ERROR = 1
WARNING = 2
INFO = 3
def initialize
@log = File.open("log.txt","w+")
@level = WARNING
end
def error(msg)
@log.puts("ERROR:" + msg)
@log.flush
end
def warning(msg)
@log.puts("WARNING:" + msg) if @level >= WARNING
@log.flush
end
def info(msg)
@log.puts("INFO:" + msg) if @level >= INFO
@log.flush
end
end
SimpleLogger.instance.error('Computer wins chess game14444444444')
SimpleLogger.instance.warning('Computer wins chess game24444444')
#
# three 使用类作为单例
#
class ClassBasedLogger
ERROR = 1
WARNING = 2
INFO = 3
@@log = File.open("log.txt","w+")
@@level = WARNING
def self.error(msg)
@@log.puts("ERROR:" + msg)
@@log.flush
end
def self.warning(msg)
@@log.puts("WARNING:" + msg) if @level >= WARNING
@@log.flush
end
def self.info(msg)
@@log.puts("INFO:" + msg) if @level >= INFO
@@log.flush
end
def self.level
@@level
end
def self.level=(new_level)
@@level = new_level
end
end
#
# four 使用模组作为单例,使用模组的好处是不能创建模组的实例
#
module ModuleBasedLogger
ERROR = 1
WARNING = 2
INFO = 3
@@log = File.open("log.txt","w+")
@@level = WARNING
def self.error(msg)
@@log.puts("ERROR:" + msg)
@@log.flush
end
def self.warning(msg)
@@log.puts("WARNING:" + msg) if @level >= WARNING
@@log.flush
end
def self.info(msg)
@@log.puts("INFO:" + msg) if @level >= INFO
@@log.flush
end
def self.level
@@level
end
def self.level=(new_level)
@@level = new_level
end
end