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

首頁 > 編程 > Ruby > 正文

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

2020-02-24 15:37:07
字體:
來源:轉載
供稿:網友

????? 單模式是Java中最簡單的設計模式之一,這種類型的設計模式其實就是創建的模式,它提供了創建對象的最佳方式,本文詳解Ruby設計模式編程中對單例模式的運用,武林技術頻道將為你繼續分享。

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


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

?

singleton

ruby.html="" tags="">ruby;">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

上面的代碼試圖創建兩個瀏覽器對象,但實際上創建的兩個對象是相同的。盡管打開了兩個IE窗口,但對象仍然是一個,即test和test2是同一個對象。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品国产一区二区三区在线观看| 国产成人av网址| 97在线视频精品| www.日韩av.com| 国内精品久久久久影院 日本资源| 国产在线视频91| 97精品国产aⅴ7777| 在线亚洲国产精品网| 97精品伊人久久久大香线蕉| 欧美激情在线观看视频| 欧美疯狂xxxx大交乱88av| 色婷婷av一区二区三区在线观看| 亚洲一区二区三区777| 亚洲人成在线观看网站高清| 久久久久久久999精品视频| 国产色婷婷国产综合在线理论片a| 国产在线精品一区免费香蕉| 日av在线播放中文不卡| 97在线视频免费看| 国产精品一区二区久久久久| 亚洲精品www久久久久久广东| 国产日韩欧美电影在线观看| 国产精品免费久久久久久| 亚洲第一网中文字幕| 国产91在线播放九色快色| 亚洲区中文字幕| 欧美有码在线观看视频| 在线观看国产精品日韩av| 亚洲综合中文字幕68页| 亚洲一区二区国产| 亚洲视频专区在线| 欧美激情精品久久久久久| 国产精品三级网站| 亚州成人av在线| 伊人一区二区三区久久精品| 欧美精品九九久久| 日韩av色在线| 狠狠做深爱婷婷久久综合一区| 欧美激情欧美激情在线五月| 午夜欧美不卡精品aaaaa| 欧美日韩国产丝袜另类| 欧美视频中文字幕在线| 国产精品69av| 法国裸体一区二区| 色婷婷综合久久久久中文字幕1| 亚洲视频免费一区| 精品久久久久久久久国产字幕| 欧美激情国产高清| 亚洲精品国产免费| 伊人久久久久久久久久久| 亚洲精品久久久久久久久久久久久| 日本人成精品视频在线| 91久久久久久久久久| 国产97在线视频| 成人h片在线播放免费网站| 精品视频久久久| 欧美精品第一页在线播放| 亚洲天堂av在线免费观看| 黄色精品一区二区| 97色伦亚洲国产| 国产精品高潮粉嫩av| 欧美夫妻性视频| 欧美自拍大量在线观看| 亚洲福利在线视频| 在线播放国产一区二区三区| 日韩电影大片中文字幕| 在线亚洲男人天堂| 欧美大成色www永久网站婷| 久久精品91久久香蕉加勒比| 久久久av免费| 国外视频精品毛片| 欧美大片在线影院| 欧美在线性爱视频| 91精品国产综合久久香蕉最新版| 久久久久久国产精品久久| 欧美大荫蒂xxx| 亚洲2020天天堂在线观看| 亚洲激情小视频| 国产精品久久久久久久天堂| 亚洲精品中文字| 亚洲欧洲第一视频| 久久久久久97| 国产成人鲁鲁免费视频a| 韩国精品美女www爽爽爽视频| 国产日本欧美一区二区三区在线| 国产精品久久久久久久app| 国模gogo一区二区大胆私拍| 亚洲一区二区免费| 国产亚洲激情在线| 北条麻妃在线一区二区| 精品国产电影一区| 欧美一区二区三区免费视| 日韩精品视频在线观看免费| 久久久91精品国产一区不卡| 亚洲国产精品推荐| 久久91精品国产91久久跳| 久久久久久尹人网香蕉| 欧美精品在线播放| 成人xxxxx| 亚洲第一精品自拍| 亚洲国产精品久久| 热99精品里视频精品| 亚洲精品网站在线播放gif| 精品国产福利在线| 欧美亚洲另类视频| 欧美精品在线观看| 亚洲人成在线一二| 日韩视频在线观看免费| 精品视频在线观看日韩| 日韩激情av在线播放| 奇米一区二区三区四区久久| 亚洲精品福利在线| 久久资源免费视频| 久久视频在线免费观看| 欧美日韩在线第一页| 日本a级片电影一区二区| 日韩免费黄色av| 777777777亚洲妇女| 色综合亚洲精品激情狠狠| 欧美激情中文字幕在线| 亚洲欧美精品一区二区| 国模精品一区二区三区色天香| 综合136福利视频在线| 欧美自拍视频在线| 国产精品日韩在线| 国产精品黄色影片导航在线观看| 伊人久久精品视频| 欧美做爰性生交视频| 亚洲人成电影在线观看天堂色| 国产精品va在线播放我和闺蜜| 欧美日韩国产在线| 亚洲国模精品私拍| 亚洲精品国产品国语在线| 国产色婷婷国产综合在线理论片a| 国产精品一区二区3区| 国产69精品久久久| 黄色一区二区三区| 日韩在线视频中文字幕| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲精品午夜精品| 亚洲精品二三区| 国产成人精品免高潮在线观看| 亚洲色图欧美制服丝袜另类第一页| 精品中文字幕久久久久久| 欧美高清一级大片| 久久99精品久久久久久青青91| 久久国产精品久久久久久| 日韩国产高清视频在线| 国产综合视频在线观看| 欧美电影免费观看| 精品中文字幕在线观看| 国产欧美一区二区三区久久| 亚洲最大的av网站| 日韩成人激情影院| 亚洲人av在线影院| 欧美一区二区三区图| 久久亚洲一区二区三区四区五区高| 精品亚洲男同gayvideo网站| 亚洲视频免费一区| 久久久久中文字幕| 97成人精品区在线播放| 草民午夜欧美限制a级福利片| 亲子乱一区二区三区电影| 亚洲国产精品久久精品怡红院|