亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? flyweightpattern.htm

?? 程式設計是思維具體化的一種方式
?? HTM
字號:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>



  
  
  
  <link rel="stylesheet" href="css/stdlayout.css" type="text/css">



  
  
  
  <link rel="stylesheet" href="css/print.css" type="text/css">



  
  
  
  <meta content="text/html; charset=gb2312" http-equiv="content-type">



  
  
  
  <title>Flyweight 模式</title>
</head>


<body>



<h3><a href="http://caterpillar.onlyfun.net/GossipCN/index.html">From
Gossip@caterpillar</a></h3>



<h1><a href="CppGossip.html">Design Pattern: Flyweight 模式</a></h1>



在 <a href="GoF.htm">Gof 的書</a>中指出,Flyweight的目的在于運用共享技術,使得一些細粒度的物件可以共享。<br>
<br>
Flyweight在牛津字典中的解釋是"boxer of the lightest class"。意思是特輕量級拳擊手?其實應該是取"the
lightest
class"這部份的解釋,一個特輕量級類別,這個類別所產生的物件可以共用在每一個場合(context),并依場合資訊表現物件外觀。<br>
<br>
在書中所舉出的例子是文檔編輯器中的字元物件,若每個字元物件會包括字元、大小、字型等等不同的資訊,想想一篇文章中可能出現多少字元,如果我們為每一個
字元都使用一個物件來完整描述有關于它的訊息,那么一篇文字中將會耗用多少的記憶體?!字元本身應可以共享,而大小、字型等等不同的資訊再分別設定。<br>
<br>
考慮數量多且性質相近的物件時,將該物件的資訊分為兩個部份:內部狀態(intrinsic)與外部狀態(extrinsic)。以上例來說,字元屬于內部狀態,而大小、字型等等不同的資訊屬于外部狀態。<br>
<br>
更詳細一些來說明,內部狀態是物件可共享的訊息部份,例如在繪制一個英文字串時,重覆的字元部份為內部狀態,像是 "ABC is
BAC",其中A、B、C的字元資訊部份不必直接儲存于字元物件中,它是屬于可以共享的部份,可以將這些可以重復使用的字元儲存在Flyweight
Pool中。<br>
<br>
外部狀態是物件依賴的一個場景(context),例如繪制字元時的字型資訊、位置資訊等等,繪制一個字元時,先從Flyweight Pool中找出共享的Flyweight,然后從場景中查找對應的繪制資訊(字型、大小、位置等)。<br>
<br>
其實任何學過Java的人就一定使用過Java中運用Flyweight模式的好處,要知道,如果您在程式中使用下面的方式來宣告,則實際上是指向同一個字串物件:<br>
<div style="margin-left: 40px;"><span style="font-weight: bold; font-family: Courier New,Courier,monospace;">String str1 = "flyweight";</span><br style="font-weight: bold; font-family: Courier New,Courier,monospace;">
<span style="font-weight: bold; font-family: Courier New,Courier,monospace;">String str2 = "flyweight"; </span><br style="font-weight: bold; font-family: Courier New,Courier,monospace;">
<span style="font-weight: bold; font-family: Courier New,Courier,monospace;">System.out.println(str1 == str2);</span><br>
</div>
&nbsp;<br>
程式的執行結果會顯示True,在Java中,會維護一個String Pool,對于一些可以共享的字串物件,會先在String
Pool中查找是否存在相同的String內容(字元相同),如果有就直接傳回,而不是直接創造一個新的String物件,以減少記憶體的耗用。<br>
<br>
再來個一看例子,String的intern()方法,我們來看看它的API說明的節錄:<br>
<div style="margin-left: 40px;"><span style="font-weight: bold; font-family: Courier New,Courier,monospace;">Returns a canonical representation for the string object.</span><br style="font-weight: bold; font-family: Courier New,Courier,monospace;">
<br style="font-weight: bold; font-family: Courier New,Courier,monospace;">
<span style="font-weight: bold; font-family: Courier New,Courier,monospace;">A pool of strings, initially empty, is maintained privately by the class String.</span><br style="font-weight: bold; font-family: Courier New,Courier,monospace;">
<br style="font-weight: bold; font-family: Courier New,Courier,monospace;">
<span style="font-weight: bold; font-family: Courier New,Courier,monospace;">When
the intern method is invoked, if the pool already contains a string
equal to this String object as determined by the equals(Object) method,
then the string from the pool is returned. Otherwise, this String
object is added to the pool and a reference to this String object is
returned.</span><br>
</div>
<br>
這段話其實已說明了Flyweight模式的運作方式,用個實例來說明會更清楚:<br>
<ul>
  <li>Main.java</li>
</ul>
<pre>public class Main { <br>    public static void main(String[] args) { <br>        String str1 = "fly"; <br>        String str2 = "weight"; <br>        String str3 = "flyweight"; <br>        String str4; <br><br>        str4 = str1 + str2; <br>        System.out.println(str3 == str4); <br><br>        str4 = (str1 + str2).intern(); <br>        System.out.println(str3 == str4); <br>    } <br>}</pre>
<br>
在程式中第一次比較str3與str4物件是否為同一物件時,您知道結果會是false,而intern()方法會先檢查 String
Pool中是否存在字元部份相同的字串物件,如果有的話就傳回,由于程式中之前已經有"flyweight"字串物件,intern()在String
Pool中發現了它,所以直接傳回,這時再進行比較,str3與str4所指向的其實是同一物件,所以結果會是true。<br>
<br>
Flyweight模式在傳回物件時,所使用的是工廠模式,使用者并不會知道物件被創造的細節,下圖是Flyweight模式的結構圖: <br>

<div style="text-align: center;"><img style="width: 450px; height: 265px;" alt="Flyweight" title="Flyweight" src="images/flyweight-1.jpg"><br>
</div>
<br>
之前舉的例子是針對物件的內部狀態所作的說明,那么字型資訊等外部的設定呢?一兩個簡單的外部資訊設定可以直接寫死(hard code)在程式中,例如簡單的使用介面字型設定。<br>
<br>
但如果是文書處理器呢?使用者設定字型、大小等資訊會是動態的呢?Gof書中將字型資訊作為是繪制字元的外部狀態,使用一個Context
物件來維護外部狀態資料庫,每次要繪制字元物件時,這個Context物件會被作為參數傳遞給字元物件,字元物件透過查找Context中的資料來獲得字
型資訊,從而進行正確的場景繪制。<br>
<br>
外部狀態維護與內部狀態之間的對應關系,在查找時,Gof書中所使用的是BTree?結構,由于查找必須花費時間,所以這也指出了使用Flyweight
模式所必須付出的代價:以時間換取空間。如何設計外部狀態的資料結構,以使得查找時間縮短,這是另一個重要的課題(不過就不是這篇文章要討論的課題了)。<br>
<br>
補充:關于字元(內部狀態)及字型、大小(外部狀態)之間的對應問題通常不太需要程式設計人員的關心,因為通常可以找的到一些現成的圖型介面API,它們都設計好一些相關元件,直接使用就可以了。<br>
<br>



</body>
</html>

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
1区2区3区精品视频| 日韩欧美三级在线| 美腿丝袜亚洲色图| 一区二区欧美精品| 国产精品情趣视频| 日韩一级免费一区| 国产精品亚洲一区二区三区妖精| 亚洲电影中文字幕在线观看| 中文字幕一区av| 中文字幕精品一区二区精品绿巨人| 日韩欧美国产一区在线观看| 欧美撒尿777hd撒尿| 色悠久久久久综合欧美99| 粉嫩13p一区二区三区| 天天综合色天天| 亚洲成av人片| 亚洲成av人综合在线观看| 一个色妞综合视频在线观看| 综合激情成人伊人| 一区二区三区中文字幕在线观看| 国产精品传媒视频| 有码一区二区三区| 亚洲狠狠爱一区二区三区| 337p粉嫩大胆噜噜噜噜噜91av| 日韩欧美国产综合| 欧美大胆一级视频| 久久婷婷一区二区三区| 欧美视频你懂的| 欧美日韩高清一区二区| 欧美一区二区三区啪啪| 欧美群妇大交群的观看方式| 欧美久久久久中文字幕| 欧美一区二区三区日韩| 精品国产制服丝袜高跟| 中文字幕精品三区| 亚洲一区在线观看免费| 人人精品人人爱| 国产成人亚洲精品青草天美| 97精品电影院| 欧美久久一区二区| 国产午夜精品在线观看| 2020国产精品自拍| 亚洲免费av网站| 日本不卡在线视频| 日韩精品欧美精品| 粉嫩av亚洲一区二区图片| 99久久99久久精品国产片果冻| 色老综合老女人久久久| 欧美一区二区视频在线观看2020 | 麻豆精品在线观看| 国产传媒欧美日韩成人| 色久综合一二码| 日韩一区二区精品| 国产欧美日本一区视频| 夜色激情一区二区| 国产99一区视频免费| 欧美日韩国产欧美日美国产精品| 久久久五月婷婷| 亚洲自拍都市欧美小说| 亚洲少妇30p| 精久久久久久久久久久| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 午夜一区二区三区视频| 国产乱人伦偷精品视频不卡| 欧美日韩高清不卡| 中文字幕一区在线观看| 狠狠久久亚洲欧美| 91精品国产综合久久精品| 精品国产一二三| 午夜精品久久久久久不卡8050| 国产精品亚洲午夜一区二区三区| 欧美精品久久久久久久久老牛影院| 欧美疯狂性受xxxxx喷水图片| 国产精品丝袜一区| 国产呦萝稀缺另类资源| 91精品国产入口| 亚洲精品中文字幕乱码三区| 国产一区二区三区四区五区美女| 欧美区在线观看| 国产精品美女视频| 风流少妇一区二区| 日韩视频一区二区三区| 天天综合色天天综合色h| 欧美自拍丝袜亚洲| 亚洲欧洲色图综合| 国产成人午夜精品影院观看视频| 欧美经典一区二区三区| 91在线观看一区二区| 一区二区三区中文字幕| 欧美精品18+| 国产真实精品久久二三区| 国产欧美一区二区三区沐欲 | 日韩av网站在线观看| 91精品国产91热久久久做人人| 久久草av在线| 国产精品免费看片| 欧美日韩你懂得| 激情图区综合网| 日韩一区在线免费观看| 欧美日韩精品一区二区| 久久精品久久精品| 一区在线中文字幕| 日韩精品一区二| 91视视频在线观看入口直接观看www| 一区二区在线免费观看| 日韩欧美一区二区久久婷婷| 处破女av一区二区| 日本伊人色综合网| 中文字幕一区二区三区四区| 欧美三级在线播放| 国产传媒欧美日韩成人| 亚洲另类春色校园小说| 精品免费99久久| 色综合一区二区| 国产一区二区三区在线看麻豆| 亚洲乱码国产乱码精品精小说 | 亚洲色图另类专区| 日韩欧美国产系列| 欧美丝袜丝交足nylons| 国产成人啪午夜精品网站男同| 亚洲最色的网站| 国产精品国产三级国产aⅴ入口| 在线播放欧美女士性生活| 成人精品一区二区三区四区| 全部av―极品视觉盛宴亚洲| 中文字幕一区日韩精品欧美| 欧美精品一区二区三区视频| 欧美性色欧美a在线播放| 成人精品视频一区二区三区尤物| 奇米四色…亚洲| 亚洲v日本v欧美v久久精品| 国产精品乱人伦| 亚洲精品一区在线观看| 欧美精品成人一区二区三区四区| eeuss鲁片一区二区三区| 国内精品视频666| 日本不卡一区二区| 午夜婷婷国产麻豆精品| 亚洲一线二线三线久久久| 国产精品卡一卡二| 欧美激情一区二区三区在线| 精品国产一区a| 日韩一级片在线观看| 日韩午夜电影在线观看| 在线不卡一区二区| 欧美精品一级二级| 在线看国产日韩| 欧美日韩精品三区| 欧美麻豆精品久久久久久| 欧美电影在线免费观看| 欧美日韩国产综合视频在线观看| 色婷婷av一区| 欧美午夜电影网| 欧美一区二区三区视频| 日韩欧美国产系列| 精品成人a区在线观看| 久久亚洲一区二区三区明星换脸 | 精品少妇一区二区三区日产乱码 | 色婷婷综合久久| 色狠狠色狠狠综合| 91国产福利在线| 欧美日韩大陆一区二区| 欧美精品一二三区| 欧美不卡视频一区| 亚洲国产精品二十页| 亚洲品质自拍视频| 亚洲综合激情网| 美女爽到高潮91| 丁香另类激情小说| 在线观看亚洲精品| 日韩一区二区三区四区五区六区| 精品欧美一区二区三区精品久久| 久久蜜桃香蕉精品一区二区三区| 国产精品伦一区二区三级视频| 亚洲免费av在线| 美女在线视频一区| 99在线视频精品| 6080日韩午夜伦伦午夜伦| 精品国产亚洲在线| 亚洲精品欧美激情| 日本欧美韩国一区三区| 春色校园综合激情亚洲| 精品视频在线看| 久久精品一区二区| 亚洲一区二区精品视频| 国产剧情一区二区三区| 欧美制服丝袜第一页| 精品国产乱码久久久久久牛牛 | 欧美无砖专区一中文字| 亚洲精品一区二区精华| 自拍av一区二区三区| 久久99最新地址| 欧美视频一区二区| 中文字幕五月欧美| 国产一区二区三区在线观看免费| 欧美午夜免费电影| 国产精品久久精品日日| 国内精品国产成人国产三级粉色 | 欧美xxxxxxxx| 亚洲高清一区二区三区|