我的漫漫程序之旅

          專注于JavaWeb開發(fā)
          隨筆 - 39, 文章 - 310, 評(píng)論 - 411, 引用 - 0
          數(shù)據(jù)加載中……

          Flyweight模式 的學(xué)習(xí)

          一、Flyweight模式的意圖:

          緩存(共享)可以共同的對(duì)象、屬性,避免創(chuàng)建大量的重復(fù)對(duì)象、內(nèi)容。

          二、Flyweight模式的特點(diǎn):

          為重復(fù)或可共享的對(duì)象、屬性設(shè)置一個(gè)緩沖,稱為內(nèi)部屬性。這些內(nèi)部屬性一般情況下都是不可修改的,也就是在第一個(gè)對(duì)象、屬性被創(chuàng)建后,就不會(huì)去修改了(否則就沒意義了)。

          除了共享對(duì)象、屬性之外,還有一些是基于應(yīng)用環(huán)境,或是實(shí)時(shí)數(shù)據(jù),這些無法共享的東西我們稱為外部狀態(tài)。

          在Flyweight模式應(yīng)用中,通常修改的是外部狀態(tài)屬性,而內(nèi)部狀態(tài)屬性一般都是用于參考或計(jì)算時(shí)引用。

          三、Flyweight模式的構(gòu)成:


          Flyweight模式一般由幾個(gè)部分組成:

          ·Flyweight接口(抽象類) :定義了一個(gè)可共享的元類
          ·Flyweight實(shí)現(xiàn)類:實(shí)現(xiàn)了元類中的操作,而且可能會(huì)提供一個(gè)用于保存內(nèi)部狀態(tài)(共享屬性)的空間
          ·Flyweight Factory:創(chuàng)建Flyweight的工廠類,創(chuàng)建后將其保存到Flyweight Pool中
          ·Flyweight Pool:緩沖Flyweight對(duì)象的池,通常包含在工廠類中


          四、Flyweight模式的簡(jiǎn)單實(shí)現(xiàn)

          1.Flyweight:

          package com.pattern.flyweight2;

          public abstract class Flyweight
          {
              
          public abstract void operation();
          }


          2.ConcreateFlyweight:
          package com.pattern.flyweight2;

          public class ConcreateFlyweight extends Flyweight
          {
              
          private Object key;

              
          public ConcreateFlyweight(Object key)
              
          {
                  
          this.key = key;
              }


              @Override
              
          public void operation()
              
          {
                  System.out.println(
          "key:" + key);
              }


          }

          3.FlyweightFactory:
          package com.pattern.flyweight2;

          import java.util.Hashtable;

          @SuppressWarnings(
          "unchecked")
          public class FlyweightFactory
          {
           //Flyweight pool
              
          private Hashtable flyweights = new Hashtable();

              
          public Flyweight getFlyweight(Object key)
              
          {
                  Flyweight flyweight 
          = null;
                  
          if(flyweights.containsKey(key))
                  
          {
                      flyweight 
          = (Flyweight) flyweights.get(key);
                  }

                  
          if (!flyweights.containsKey(key))
                  
          {
                      flyweight 
          = new ConcreateFlyweight(key);
                      flyweights.put(key, flyweight);
                  }

                  
          return flyweight;
              }

              
              
          public int getFlyweightsSize()
              
          {
                  
          return flyweights.size();
              }

          }


          4.測(cè)試類:
          package com.pattern.flyweight2;

          public class Client
          {
              
          private Flyweight f1 = null;
              
          private Flyweight f2 = null;
              
          private Flyweight f3 = null;
              
          private Flyweight f4 = null;
              FlyweightFactory factory 
          = new FlyweightFactory();

              
          public Client()
              
          {
                  f1 
          = factory.getFlyweight("baidu");
                  f2 
          = factory.getFlyweight("google");
                  f3 
          = factory.getFlyweight("baidu");
                  f4 
          = factory.getFlyweight("google");
              }


              
          public void show()
              
          {
                  f1.operation();
                  f2.operation();
                  f3.operation();
                  f4.operation();
                  System.out.println(factory.getFlyweightsSize());
              }


              
          public static void main(String[] args)
              
          {
                  Client client 
          = new Client();
                  client.show();
              }

          }

          也就是在緩沖這一點(diǎn)上,體現(xiàn)了Flyweight模式的精髓。

          posted on 2008-05-27 10:42 々上善若水々 閱讀(3178) 評(píng)論(0)  編輯  收藏 所屬分類: 設(shè)計(jì)模式

          主站蜘蛛池模板: 克东县| 绿春县| 大兴区| 达拉特旗| 永靖县| 宝鸡市| 峨山| 时尚| 寿光市| 城口县| 大荔县| 五台县| 仙游县| 高密市| 固镇县| 四平市| 英超| 施秉县| 大埔县| 江山市| 山阴县| 垫江县| 大庆市| 宁夏| 新宾| 周至县| 长宁区| 溆浦县| 论坛| 赣州市| 丰顺县| 金秀| 南汇区| 上思县| 仁怀市| 西盟| 班玛县| 四子王旗| 杭州市| 大洼县| 永年县|