亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Ruby > 正文

詳解Ruby設計模式編程中對單例模式的運用

2020-10-29 19:36:22
字體:
來源:轉載
供稿:網友

簡介
      單例模式是設計模式中最簡單的形式之一。這一模式的目的是使得類的一個對象成為系統中的唯一實例。要實現這一點,可以從客戶端對其進行實例化開始。因此需要用一種只允許生成對象類的唯一實例的機制,“阻止”所有想要生成對象的訪問。使用工廠方法來限制實例化過程。這個方法應該是靜態方法(類方法),因為讓類的實例去生成另一個唯一實例毫無意義。


要點
      顯然單例模式的要點有三個;一是某個類只能有一個實例;二是它必須自行創建這個實例;三是它必須自行向整個系統提供這個實例。
      從具體實現角度來說,就是以下三點:一是單例模式的類只提供私有的構造函數,二是類定義中含有一個該類的靜態私有對象,三是該類提供了


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_count 為2,二@instance_count為0,因為類變量被所有實例所共享,黨cv1.increment調用了兩次以后@@class_count為2,創建第二個ClassVariableTester對象cv2的時候,共享了@@class_count,所以此時的@@class_count仍為2。
而實例變量只能為當前對象服務,所以實例對象cv2的@@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 

 
結果為:true 。
采用一個類變量來保存僅有的一個類的實例,同時需要一個類方法返回這個單例實例。  
 
但是通過SimpleLogger.new還是可以創建另一個實例對象,因此需要把著個new方法設為私有的。  

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 

 
結果為:true 
 
Ruby類庫中提供了singleton,來簡化單例類的創建。 
混入Singleton,就省略了創建類變量,初始化單例實例,創建類級別的instance方法,以及將new設為私有。 
通過SimpleLogger.instance來獲取日志器的單例。 
 
但是兩種方式還是又差異的。 
第一種方式稱之為“勤性單例(eager instantiation)”。 
在確實需要之前就創建了實例對象。 
第二種方式稱之為“惰性單例(lazy instantiation)” 
在調用instance時才會去創建  。
 
但是這個Singleton不能真正的阻止任何事情,可以用過public_class_method改變new方法的為公用的。 
打開類,設置new方法為public之后,就可以用SimpleLogger.new來創建對象了。  

class SimpleLogger  public_class_method :new end  puts SimpleLogger.new 

再來分兩種情況:

(一)使用全局變量,盡量不要使用全局變量,因為全局變量是程序緊密的耦合在一起, 
其實單例模式和全局變量的作用是一樣的, 
$logger = 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 endendtest,test2 = AutoTest.instancetest.OpenUrl('http://www.baidu.com')test.set_textarea('aslandhu')test.click

 
這里雖然創建了兩個AutoTest實例,但是第二個實例其實為nil,也就是說并沒有創建成功。
 

require 'rubygems'require 'watir'require 'singleton'require 'thread'class TestOneObj endclass <<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  endendtest = TestOneObj.instancetest2 = TestOneObj.instancep test.inspectp test2.inspecttest.openurl('www.baidu.com')test2.set_textarea('aslandhu')test.click

上面這段代碼試圖創建兩個Browser對象,但事實上創建的兩個對象均為同一個。雖然打開了兩個IE窗口,但是對象還是一個,即test與test2是同一個對象。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美午夜激情在线| 在线观看欧美视频| 精品一区二区三区四区| 国产成人亚洲精品| 91极品女神在线| 亚洲女性裸体视频| 欧美三级欧美成人高清www| 2019日本中文字幕| 国产乱人伦真实精品视频| 日本精品久久中文字幕佐佐木| 日韩欧美福利视频| 欧美午夜无遮挡| 国产精品igao视频| 欧美黑人国产人伦爽爽爽| 亚洲国产精久久久久久| 性亚洲最疯狂xxxx高清| 亚洲综合第一页| 亚洲精品久久久久| 国产一区香蕉久久| 亚洲欧美中文字幕| 欧洲成人在线观看| 成人亚洲欧美一区二区三区| 亚洲色图日韩av| 中文.日本.精品| 色综合久久88色综合天天看泰| 久久久久久久久久久av| 欧美久久精品午夜青青大伊人| 成人黄色免费片| 国产一区二区三区直播精品电影| 国产精品视频区1| 国产精品永久免费| 亚洲人在线观看| 中文字幕久热精品在线视频| 日韩美女福利视频| 国产精品美女www爽爽爽视频| 国产精品免费福利| 亚洲一区二区三区xxx视频| 国产91色在线|| 国产午夜精品全部视频播放| 日韩激情视频在线| www.日韩.com| 欧美性开放视频| 亚洲精品久久在线| 欧美国产亚洲视频| 国产精品自拍偷拍视频| 色99之美女主播在线视频| 久久亚洲电影天堂| 91免费欧美精品| 久久手机精品视频| 欧美一级视频在线观看| 欧美亚州一区二区三区| 亚洲色图偷窥自拍| 国产suv精品一区二区三区88区| 日韩精品久久久久久福利| 国产成人激情视频| 日本在线观看天堂男亚洲| 亚洲国产日韩欧美综合久久| 日韩一区在线视频| 亚洲电影成人av99爱色| 永久免费毛片在线播放不卡| 日韩av中文字幕在线播放| 国产精品亚洲一区二区三区| 色av中文字幕一区| 国产成人高潮免费观看精品| 国产一区二区香蕉| 亚洲欧美另类在线观看| 最近2019年中文视频免费在线观看| 欧美电影电视剧在线观看| 日韩在线视频线视频免费网站| 精品久久久久久久久久久久久久| 欧美激情视频免费观看| 亚洲天堂男人的天堂| 亚洲在线免费看| 午夜精品一区二区三区在线视频| 国产亚洲精品久久久久久牛牛| 精品亚洲一区二区三区在线观看| 成人xxxxx| 亚洲天堂成人在线视频| 色综合91久久精品中文字幕| 97视频免费看| 成人激情视频在线| 精品一区二区三区三区| 亚洲在线观看视频网站| 国产成人精品999| 欧美在线一区二区视频| 国产丝袜一区二区| 91精品免费视频| 日韩中文字在线| 国产91精品久久久久久| 国产精品igao视频| 国产一区二区三区在线观看网站| 成人久久一区二区三区| 亚洲天堂免费观看| 久久人体大胆视频| 日韩在线高清视频| 日韩免费不卡av| 中文字幕九色91在线| 色综合男人天堂| 国产精品亚洲一区二区三区| 久久久久久久成人| 久久精品色欧美aⅴ一区二区| 亚洲最新在线视频| 日韩精品免费视频| 欧美诱惑福利视频| 日韩电影中文字幕在线| 久久免费国产精品1| 久久亚洲精品小早川怜子66| 国产精品偷伦视频免费观看国产| 麻豆成人在线看| 精品欧美一区二区三区| 亚洲美女av网站| 国产精品无码专区在线观看| 久久久久久com| 2018国产精品视频| 欧美日产国产成人免费图片| 日本一区二三区好的精华液| 国产精品久久久久久久天堂| 国产精品久久久久久久久粉嫩av| 日韩在线免费av| 国产欧美一区二区| 国产日韩欧美在线看| 国产精品久久久久久久久久新婚| 欧美激情videos| 欧美有码在线观看视频| 久久久久久国产| 久久久免费观看视频| 亚洲性日韩精品一区二区| 蜜臀久久99精品久久久久久宅男| 欧美日韩国产中字| 中文字幕在线看视频国产欧美| 91精品国产一区| 久久久久久这里只有精品| 精品日韩视频在线观看| 亚洲成人黄色网址| 欧美精品激情blacked18| 日韩电影免费在线观看| 欧美性xxxxxxxxx| 综合国产在线视频| 在线观看久久久久久| 国产精品亚洲精品| 热久久免费视频精品| 国产精品户外野外| 久久亚洲成人精品| 91精品国产自产在线观看永久| 色噜噜亚洲精品中文字幕| 亚洲激情在线观看| 亚洲激情视频在线观看| 91色视频在线观看| 日韩精品免费看| 国产在线高清精品| 96sao精品视频在线观看| 国产精品青青在线观看爽香蕉| 国产精品日韩在线观看| 国产日韩欧美另类| 国产有码在线一区二区视频| 日韩精品黄色网| 亚洲黄色在线观看| 国产午夜精品麻豆| 国产脚交av在线一区二区| 亚洲三级av在线| 亚洲国产91色在线| 国产亚洲欧洲在线| www.精品av.com| 亚洲精品456在线播放狼人|