中国银行 杨益民:RUBY设计模式之单例模式

来源:百度文库 编辑:中财网 时间:2024/04/26 14:02:38

RUBY设计模式之单例模式

    博客分类:
  • RUBY
设计模式Ruby

     单例singleton,是所有设计模式中最简单的,但又是问题最多的。其实并不简单,一定要慎用。

 

     singleton,和全局变量很相似,所以要尽量的不用它,问题也就不会出来。而不是我们常常说的那样这个我们可以用

 

singleton来实现。不出问题的唯一方法就是:别那么做。

 

     如果要使用了,在使用之前必须知道你要做的东西是否必须要用他来实现,还有就是要进行严密的测试。这样说是有

 

事实依据的,我们现在跑了三四年的程序中就有好几个地方用到的,在这期间发生了很多问题都和它有关。其中一个问题是

 

想写一个singleton,但是没有安装标注去写,也没有严密的测试,结果造成了非常严重的后果。

 

 

    下面是ruby实现singleton一些方法。大家多提意见。

 

 

Ruby代码  
  1. #   
  2. # one   
  3. #   
  4. class SimpleLogger   
  5.      
  6.   attr_accessor :level  
  7.      
  8.   ERROR = 1   
  9.   WARNING = 2   
  10.   INFO = 3   
  11.   def initialize   
  12.     @log = File.open("log.txt","w+")   
  13.     @level = WARNING   
  14.   end  
  15.      
  16.   def error(msg)   
  17.     @log.puts("ERROR:" + msg)   
  18.     @log.flush   
  19.   end  
  20.      
  21.   def warning(msg)   
  22.     @log.puts("WARNING:" + msg) if @level >= WARNING   
  23.     @log.flush   
  24.   end  
  25.      
  26.   def info(msg)   
  27.     @log.puts("INFO:" + msg) if @level >= INFO   
  28.     @log.flush   
  29.   end  
  30.   #   
  31.   # 创建单例模式,需要将这些方法放在initialize方法之后,要记住ruby是动态的   
  32.   #   
  33.   @@instance = SimpleLogger.new  
  34.      
  35.   def self.instance   
  36.     return @@instance  
  37.   end  
  38.      
  39.   private_class_method :new  
  40.      
  41. end  
  42.   
  43. logger1 = SimpleLogger.instance   
  44. logger2 = SimpleLogger.instance   
  45.   
  46. SimpleLogger.instance.info('Computer wins chess game1')   
  47. SimpleLogger.instance.warning('Computer wins chess game2')   
  48.   
  49. #   
  50. # two   
  51. #   
  52. require 'singleton'  
  53.   
  54. class SimpleLogger2   
  55.   include Singleton   
  56.      
  57.   attr_accessor :level  
  58.      
  59.   ERROR = 1   
  60.   WARNING = 2   
  61.   INFO = 3   
  62.   def initialize   
  63.     @log = File.open("log.txt","w+")   
  64.     @level = WARNING   
  65.   end  
  66.      
  67.   def error(msg)   
  68.     @log.puts("ERROR:" + msg)   
  69.     @log.flush   
  70.   end  
  71.      
  72.   def warning(msg)   
  73.     @log.puts("WARNING:" + msg) if @level >= WARNING   
  74.     @log.flush   
  75.   end  
  76.      
  77.   def info(msg)   
  78.     @log.puts("INFO:" + msg) if @level >= INFO   
  79.     @log.flush   
  80.   end  
  81.   
  82.      
  83. end  
  84.   
  85. SimpleLogger.instance.error('Computer wins chess game14444444444')   
  86. SimpleLogger.instance.warning('Computer wins chess game24444444')   
  87.   
  88.   
  89.   
  90. #   
  91. # three 使用类作为单例   
  92. #   
  93. class ClassBasedLogger   
  94.      
  95.   ERROR = 1   
  96.   WARNING = 2   
  97.   INFO = 3   
  98.      
  99.   @@log = File.open("log.txt","w+")   
  100.   @@level = WARNING   
  101.      
  102.      
  103.   def self.error(msg)   
  104.     @@log.puts("ERROR:" + msg)   
  105.     @@log.flush   
  106.   end  
  107.      
  108.   def self.warning(msg)   
  109.     @@log.puts("WARNING:" + msg) if @level >= WARNING   
  110.     @@log.flush   
  111.   end  
  112.      
  113.   def self.info(msg)   
  114.     @@log.puts("INFO:" + msg) if @level >= INFO   
  115.     @@log.flush   
  116.   end  
  117.   
  118.   def self.level   
  119.     @@level  
  120.   end  
  121.      
  122.   def self.level=(new_level)   
  123.     @@level = new_level   
  124.   end  
  125.      
  126. end  
  127.   
  128.   
  129. #   
  130. # four 使用模组作为单例,使用模组的好处是不能创建模组的实例   
  131. #   
  132. module ModuleBasedLogger   
  133.      
  134.   ERROR = 1   
  135.   WARNING = 2   
  136.   INFO = 3   
  137.      
  138.   @@log = File.open("log.txt","w+")   
  139.   @@level = WARNING   
  140.      
  141.      
  142.   def self.error(msg)   
  143.     @@log.puts("ERROR:" + msg)   
  144.     @@log.flush   
  145.   end  
  146.      
  147.   def self.warning(msg)   
  148.     @@log.puts("WARNING:" + msg) if @level >= WARNING   
  149.     @@log.flush   
  150.   end  
  151.      
  152.   def self.info(msg)   
  153.     @@log.puts("INFO:" + msg) if @level >= INFO   
  154.     @@log.flush   
  155.   end  
  156.   
  157.   def self.level   
  158.     @@level  
  159.   end  
  160.      
  161.   def self.level=(new_level)   
  162.     @@level = new_level   
  163.   end  
  164.      
  165. end