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

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值