cisco 交换机命名规则
2009-03-12 23:42
330 查看
单例singleton,是所有设计模式中最简单的,但又是问题最多的。其实并不简单,一定要慎用。
singleton,和全局变量很相似,所以要尽量的不用它,问题也就不会出来。而不是我们常常说的那样这个我们可以用
singleton来实现。不出问题的唯一方法就是:别那么做。
如果要使用了,在使用之前必须知道你要做的东西是否必须要用他来实现,还有就是要进行严密的测试。这样说是有
事实依据的,我们现在跑了三四年的程序中就有好几个地方用到的,在这期间发生了很多问题都和它有关。其中一个问题是
想写一个singleton,但是没有安装标注去写,也没有严密的测试,结果造成了非常严重的后果。
下面是ruby实现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