详解Ruby设计模式编程中对单例模式的运用
简介
singleton class ClassVariableTester @@class_count = 0 def initialize @instance_count = 0 end def increment @@class_count = @@class_count + 1 @instance_count = @instance_count + 1 end def to_s "class count :#{@@class_count} -- instance count :#{@instance_count}" end end cv1 = ClassVariableTester.new cv1.increment cv1.increment puts("cv1:#{cv1}") cv2 = ClassVariableTester.new puts("cv2:#{cv2}") #cv1:class count :2 -- instance count :2 #cv2:class count :2 -- instance count :0 class SimpleLogger @@instance = SimpleLogger.new def self.get_instance @@instance end private_class_method :new end sl1 = SimpleLogger.get_instance sl2 = SimpleLogger.get_instance puts sl1 == sl2 sl3 = SimpleLogger.new private method `new' called for SimpleLogger:Class (NoMethodError) require 'singleton' class SimpleLogger include Singleton end #puts SimpleLogger.new sl1 = SimpleLogger.instance sl2 = SimpleLogger.instance puts sl1 == sl2 class SimpleLogger public_class_method :new end puts SimpleLogger.new 再来分两种情况: (一)使用全局变量,尽量不要使用全局变量,因为全局变量是程序紧密的耦合在一起, (二)使用类作为单例, class SimpleLogger WARNING = 1 INFO = 2 def initialize(file) @@log = File.open(file,"w") @@level = WARNING end def self.warning(msg) puts @@level > WARNING @@log.puts(msg) if @@level > WARNING @@log.flush end def self.level @@level end def self.level=(new_level) @@level = new_level end end SimpleLogger.new("test.txt") puts SimpleLogger.level SimpleLogger.level = SimpleLogger::INFO puts SimpleLogger.level SimpleLogger.warning("warning") 实例 require 'rubygems' require 'watir' require 'singleton' class AutoTest include Singleton def OpenUrl(url) @browser= Watir::Browser.new @browser.goto(url) @url=url end def set_textarea(text) @browser.text_field(:id,'kw').set(text) end def click @browser.button(:id,'su').click end end test,test2 = AutoTest.instance test.OpenUrl('http://www.baidu.com') test.set_textarea('aslandhu') test.click require 'rubygems' require 'watir' require 'singleton' require 'thread' class TestOneObj end class <<TestOneObj include Singleton def instance @browser= Watir::Browser.new self end def openurl(url) @browser.goto(url) end def set_textarea(text) @browser.text_field(:id,'kw').set(text) end def click @browser.button(:id,'su').click end end test = TestOneObj.instance test2 = TestOneObj.instance p test.inspect p test2.inspect test.openurl('www.baidu.com') test2.set_textarea('aslandhu') test.click 上面这段代码试图创建两个Browser对象,但事实上创建的两个对象均为同一个。虽然打开了两个IE窗口,但是对象还是一个,即test与test2是同一个对象。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |