【設計模式】—— 享元模式Flyweight

  前言:【模式總覽】——————————by xingoohtml

  模式意圖

  享元模式,也叫【輕量級模式】或者【蠅量級模式】。主要目的就是爲了減小細粒度資源的消耗。好比,一個編輯器用到大量的字母數字和符號,可是不須要每次都建立一個字母對象,只須要把它放到某個地方共享使用,單獨記錄每次建立的使用上下文就能夠了。java

  再好比餐館的桌子,餐具,這些都是享元模式的體現。客戶是流動的,每次吃飯都是用飯店固定的那些餐具,而飯店也不須要每次新來顧客,就買新的盤子餐具。緩存

  應用場景

  1 一個系統應用到了大量的對象,並且不少都是重複的。編輯器

  2 因爲大量對象的使用,形成了存儲效率上的開銷。this

  3 對象的狀態大可能是外部狀態,不干擾狀態自己。spa

  4 若是剔除這些外部狀態,能夠用一組小規模的對象表示共享對象。code

 

  最近項目中就有這個使用場景,好比一些文件的圖標,因爲重複使用,徹底能夠採用這種模式,放入緩存中,之後每次調用直接從緩存中讀取就好了。htm

 

  模式結構

  FlyweightFactorty 提供共享對象的工廠方法,裏面含有一個彙集對象,通常都是用HashMap。一般這個工廠類都經過單例模式建立。對象

 1 class FlyweightFactory{  2     private HashMap map = new HashMap();  3     
 4     public FlyweightFactory() {  5  }  6     
 7     public Flyweight factory(int state){  8         if(map.containsKey(state)){  9             return (Flyweight)map.get(state); 10         }else{ 11             map.put(state, new ConcreteFlyweight(state)); 12             return (Flyweight)map.get(state); 13  } 14  } 15     
16     public void CheckMap(){ 17         System.out.println("*****************************************"); 18         int i=0; 19         for(Iterator it=map.entrySet().iterator();it.hasNext(); ){ 20             Map.Entry e = (Map.Entry)it.next(); 21             System.out.println("map.get("+(i++)+") : "+ e.getKey()); 22  } 23         System.out.println("*****************************************"); 24  } 25 }

  Flyweight 共享對象的接口,描述統一標識blog

1 interface Flyweight{ 2     public int getState(); 3 }

  ConcreteFlyweight 真正的具體實現類

1 class ConcreteFlyweight implements Flyweight{ 2     private int state; 3     public ConcreteFlyweight(int state) { 4         this.state = state; 5  } 6     public int getState() { 7         return state; 8  } 9 }

 

  所有代碼

package com.xingoo.Flyweight; import java.util.HashMap; import java.util.Iterator; import java.util.Map; class FlyweightFactory{ private HashMap map = new HashMap(); public FlyweightFactory() { } public Flyweight factory(int state){ if(map.containsKey(state)){ return (Flyweight)map.get(state); }else{ map.put(state, new ConcreteFlyweight(state)); return (Flyweight)map.get(state); } } public void CheckMap(){ System.out.println("*****************************************"); int i=0; for(Iterator it=map.entrySet().iterator();it.hasNext(); ){ Map.Entry e = (Map.Entry)it.next(); System.out.println("map.get("+(i++)+") : "+ e.getKey()); } System.out.println("*****************************************"); } } interface Flyweight{ public int getState(); } class ConcreteFlyweight implements Flyweight{ private int state; public ConcreteFlyweight(int state) { this.state = state; } public int getState() { return state; } } public class Client { public static void main(String[] args) { FlyweightFactory factory = new FlyweightFactory(); factory.factory(4); factory.factory(2); factory.factory(2); factory.factory(1); factory.factory(1); factory.factory(3); factory.CheckMap(); } }

  運行結果

***************************************** map.get(0) : 1 map.get(1) : 2 map.get(2) : 3 map.get(3) : 4
*****************************************
相關文章
相關標籤/搜索