<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    eric-1001c

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      3 隨筆 :: 45 文章 :: 12 評論 :: 0 Trackbacks
    GOF:運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度的對象。

      解釋一下概念:也就是說在一個系統(tǒng)中如果有多個相同的對象,那么只共享一份就可以了,不必每個都去實(shí)例化一個對象。比如說(這里引用GOF書中的例子)一個文本系統(tǒng),每個字母定一個對象,那么大小寫字母一共就是52個,那么就要定義52個對象。如果有一個1M的文本,那么字母是何其的多,如果每個字母都定義一個對象那么內(nèi)存早就爆了。那么如果要是每個字母都共享一個對象,那么就大大節(jié)約了資源。

      在Flyweight模式中,由于要產(chǎn)生各種各樣的對象,所以在Flyweight(享元)模式中常出現(xiàn)Factory模式。Flyweight的內(nèi)部狀態(tài)是用來共享的,Flyweight factory負(fù)責(zé)維護(hù)一個對象存儲池(Flyweight Pool)來存放內(nèi)部狀態(tài)的對象。Flyweight模式是一個提高程序效率和性能的模式,會大大加快程序的運(yùn)行速度.應(yīng)用場合很多,下面舉個例子:

      先定義一個抽象的Flyweight類:
    1package Flyweight;
    2
    3public abstract class Flyweight
    4
    5{
    6 public abstract void operation();
    7}
    //end abstract class Flyweight

    在實(shí)現(xiàn)一個具體類:
     1package Flyweight;
     2
     3public class ConcreteFlyweight extends Flyweight
     4
     5{
     6 private String string;
     7 public ConcreteFlyweight(String str)
     8 
     9 {
    10  string = str;
    11 }
    //end ConcreteFlyweight()
    12
    13 public void operation()
    14 
    15 {
    16  System.out.println("Concrete---Flyweight : " + string);
    17 }
    //end operation()
    18
    19}
    //end class ConcreteFlyweight

    實(shí)現(xiàn)一個工廠方法類:

     1package Flyweight;
     2import java.util.Hashtable;
     3
     4public class FlyweightFactory
     5
     6{
     7 private Hashtable flyweights = new Hashtable();//----------------------------1
     8 public FlyweightFactory() {}
     9
    10 public Flyweight getFlyWeight(Object obj)
    11 
    12 {
    13  Flyweight flyweight = (Flyweight) flyweights.get(obj);//----------------2
    14
    15  if(flyweight == null{//---------------------------------------------------3
    16   //產(chǎn)生新的ConcreteFlyweight
    17   flyweight = new ConcreteFlyweight((String)obj);
    18   flyweights.put(obj, flyweight);//--------------------------------------5
    19  }

    20  return flyweight;//---------------------------------------------------------6
    21 }
    //end GetFlyWeight()
    22
    23 public int getFlyweightSize()
    24 
    25 {
    26  return flyweights.size();
    27 }

    28}
    //end class FlyweightFactory


    這個工廠方法類非常關(guān)鍵,這里詳細(xì)解釋一下:

      在1處定義了一個Hashtable用來存儲各個對象;在2處選出要實(shí)例化的對象,在6處將該對象返回,如果在Hashtable中沒有要選擇的對象,此時變量flyweight為null,產(chǎn)生一個新的flyweight存儲在Hashtable中,并將該對象返回。

      最后看看Flyweight的調(diào)用:

     

     1package Flyweight;
     2import java.util.Hashtable;
     3
     4public class FlyweightPattern {
     5 FlyweightFactory factory = new FlyweightFactory(); 
     6 Flyweight fly1;
     7 Flyweight fly2;
     8 Flyweight fly3;
     9 Flyweight fly4;
    10 Flyweight fly5;
    11 Flyweight fly6;
    12
    13 /** *//** Creates a new instance of FlyweightPattern */
    14 public FlyweightPattern() {
    15  fly1 = factory.getFlyWeight("Google");
    16  fly2 = factory.getFlyWeight("Qutr");
    17  fly3 = factory.getFlyWeight("Google");
    18  fly4 = factory.getFlyWeight("Google");
    19  fly5 = factory.getFlyWeight("Google");
    20  fly6 = factory.getFlyWeight("Google");
    21 }
    //end FlyweightPattern()
    22
    23 public void showFlyweight()
    24 
    25 {
    26  fly1.operation();
    27  fly2.operation();
    28  fly3.operation();
    29  fly4.operation();
    30  fly5.operation();
    31  fly6.operation();
    32  int objSize = factory.getFlyweightSize();
    33  System.out.println("objSize = " + objSize);
    34 }
    //end showFlyweight()
    35
    36 public static void main(String[] args)
    37 
    38 {
    39  System.out.println("The FlyWeight Pattern!");
    40  FlyweightPattern fp = new FlyweightPattern();
    41  fp.showFlyweight();
    42 }
    //end main()
    43}
    //end class FlyweightPattern

    下面是運(yùn)行結(jié)果:
    1Concrete---Flyweight : Google
    2Concrete---Flyweight : Qutr
    3Concrete---Flyweight : Google
    4Concrete---Flyweight : Google
    5Concrete---Flyweight : Google
    6Concrete---Flyweight : Google
    7objSize = 2 
    我們定義了6個對象,其中有5個是相同的,按照Flyweight模式的定義“Google”應(yīng)該共享一個對象,在實(shí)際的對象數(shù)中我們可以看出實(shí)際的對象卻是只有2個。

    下面給出一個簡易的UML圖:

    posted on 2008-01-27 11:07 Eric-1001c 閱讀(467) 評論(1)  編輯  收藏 所屬分類: Design Pattern

    評論

    # re: FlyWeight Design Pattern(享元模式)(轉(zhuǎn)) 2008-05-27 09:03 々上善若水々
    收藏了。謝。  回復(fù)  更多評論
      


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲AV无码国产丝袜在线观看| 国产vA免费精品高清在线观看 | 亚洲日本人成中文字幕| 亚洲线精品一区二区三区| 日韩免费视频在线观看| 免费看h片的网站| 免费的全黄一级录像带| 搜日本一区二区三区免费高清视频| 亚洲区视频在线观看| 亚洲最大的成网4438| 亚洲尤码不卡AV麻豆| 亚洲成av人片一区二区三区| 久久WWW免费人成人片| 国产乱子精品免费视观看片| 精品视频在线免费观看| 国产va免费精品| 一级做a爰性色毛片免费| 青娱乐在线视频免费观看| 亚洲国产综合AV在线观看| 亚洲va乱码一区二区三区| 亚洲韩国在线一卡二卡| 亚洲AV无码国产精品色午友在线| 在线亚洲人成电影网站色www| 四虎国产精品免费视| 国产aa免费视频| 夜色阁亚洲一区二区三区| 四虎影视永久免费观看网址 | 2020国产精品亚洲综合网| 亚洲伊人精品综合在合线| 亚洲日本香蕉视频| 亚洲精品视频在线观看免费| 亚洲综合自拍成人| 亚洲人成电影网站| 国产亚洲精品成人AA片| 亚洲国产成人精品无码区二本| 亚洲精品自偷自拍无码| 在线亚洲v日韩v| 尤物视频在线免费观看| 成人av片无码免费天天看| 成全高清在线观看免费| 99久久国产免费-99久久国产免费|