国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Java設計模式研究之Flyweight模式

2019-11-18 13:31:51
字體:
來源:轉載
供稿:網友

  GOF:運用共享技術有效地支持大量細粒度的對象。

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

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

  先定義一個抽象的Flyweight類:

package Flyweight;

public abstract class Flyweight
...
{
 public abstract void Operation();
}//end abstract class Flyweight
  在實現一個具體類:

package Flyweight;

public class ConcreteFlyweight extends Flyweight
...
{
 PRivate String string;
 public ConcreteFlyweight(String str)
 ...
 {
  string = str;
 }//end ConcreteFlyweight(...)

 public void operation()
 ...
 {
  System.out.println("Concrete---Flyweight : " + string);
 }//end operation()

}//end class ConcreteFlyweight
  實現一個工廠方法類:

package Flyweight;
import java.util.Hashtable;

public class FlyweightFactory
...
{
 private Hashtable flyweights = new Hashtable();//----------------------------1
 public FlyweightFactory() ...{}

 public Flyweight getFlyWeight(Object obj)
 ...
 {
  Flyweight flyweight = (Flyweight) flyweights.get(obj);//----------------2

  if(flyweight == null) ...{//---------------------------------------------------3
   //產生新的ConcreteFlyweight
   flyweight = new ConcreteFlyweight((String)obj);
   flyweights.put(obj, flyweight);//--------------------------------------5
  }
  return flyweight;//---------------------------------------------------------6
 }//end GetFlyWeight(...)

 public int getFlyweightSize()
 ...
 {
  return flyweights.size();
 }
}//end class FlyweightFactory
  這個工廠方法類非常要害,這里具體解釋一下:

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

  最后看看Flyweight的調用:

package Flyweight;
import java.util.Hashtable;

public class FlyweightPattern ...{
 FlyweightFactory factory = new FlyweightFactory();
 Flyweight fly1;
 Flyweight fly2;
 Flyweight fly3;
 Flyweight fly4;
 Flyweight fly5;
 Flyweight fly6;

 /** *//** Creates a new instance of FlyweightPattern */
 public FlyweightPattern() ...{
  fly1 = factory.getFlyWeight("Google");
  fly2 = factory.getFlyWeight("Qutr");
  fly3 = factory.getFlyWeight("Google");
  fly4 = factory.getFlyWeight("Google");
  fly5 = factory.getFlyWeight("Google");
  fly6 = factory.getFlyWeight("Google");
 }//end FlyweightPattern()

 public void showFlyweight()
 ...
 {
  fly1.operation();
  fly2.operation();
  fly3.operation();
  fly4.operation();
  fly5.operation();
  fly6.operation();
  int objSize = factory.getFlyweightSize();
  System.out.println("objSize = " + objSize);
 }//end showFlyweight()

 public static void main(String[] args)
 ...
 {
  System.out.println("The FlyWeight Pattern!");
  FlyweightPattern fp = new FlyweightPattern();
  fp.showFlyweight();
 }//end main(...)
}//end class FlyweightPattern
  下面是運行結果:



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 南华县| 恩平市| 赞皇县| 临朐县| 余干县| 师宗县| 辽阳市| 清丰县| 永和县| 海阳市| 大姚县| 永仁县| 南丰县| 时尚| 广水市| 潜江市| 呼图壁县| 平远县| 江口县| 天镇县| 汕头市| 沁源县| 汾西县| 中山市| 宣恩县| 驻马店市| 泉州市| 扎鲁特旗| 胶南市| 新闻| 新干县| 清徐县| 怀仁县| 雷山县| 大庆市| 思南县| 思南县| 灵山县| 枞阳县| 河曲县| 冀州市|