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

 

 

 

你可能感兴趣的:(RUBY)