2010年5月17日 星期一

Design Pattern : 20 Flyweight

Flyweight的目的在減輕記憶體的使用量,
也就是減少new出新的物件佔據記憶體。

在整個Pattern的運作上,利用一個Factory Pool,
當需要新的物件會先向Factory查詢,
如果在Pool內已經存在,那就直接由pool內取得回傳,
若pool內沒有,才new出新物件,並存到pool內,
讓以後要用的可以取用
如此,所有相同的物件都只會被new出一個實體,
若有需要用到相同的實體,只需取用既有的instance即可

參與者
1.Animal 產生各式物件的Class
使用者要產生animal 實體,若在一般程式上會直接
new Animal,但在這Pattern下,new Animal動作是由
Factory來執行,而非由外部程式來直接產生物件
public class Animal {
    private String name;
    public Animal(String name){
        this.name=name;
        System.out.println(this.name+"--Created\n");
    }
    public void run(){
        System.out.print(this.name+"--run\n");
    }
}

2.Factory 管理所有物件的Factory
利用一個Hashtable當作pool來儲存可攻使用的instance
public class Factory {
    private Hashtable<String, Animal> pool=new Hashtable<String, Animal>();
    private static Factory instance=new Factory();
    public static Factory getInstance(){
        return instance;
    }
    public synchronized Animal getAnimal(String name){
        if(pool.get(name)==null){
            Animal tmpAnimal=new Animal(name);            
            pool.put(name,tmpAnimal);
            return tmpAnimal;
        }else{
            return pool.get(name); 
        }
    }
}

3.Main外部程式
public class Main {
    public static void main(String[] args) {
        Factory factory=Factory.getInstance();
        factory.getAnimal("man").run();
        factory.getAnimal("dog").run();
        factory.getAnimal("man").run();
        factory.getAnimal("cat").run();
        factory.getAnimal("dog").run();
        factory.getAnimal("dog").run();
    }
}
4輸出結果
由結果可以看出,每種animal都只會被產生一次
man--Created
man--run

dog--Created
dog--run

man--run

cat--Created
cat--run

dog--run

dog--run

沒有留言: