2010年3月10日 星期三

Design Pattern : 06 Prototype


通常我們產生一個instance 通常都會是利用new Class方式
來產生想要的instnace,但如果要產生的物件是一個比較麻煩的東西
譬如說,在畫布上隨手畫出的物件,想要產生多個instance,
這時候,就需要用clone的方式,針對既存的物件原形複製出來

把一個物件class當作原型,丟到manager內當作一個參考
當使用者需要一個instnace時,manager就依照這個原型
複製出一個相同物件出來,傳給需求單位

Prototype Patterng的結構是包含
1.一個Manager Class
2.一個Product 抽象類別:
定義了要在Manager內被呼叫的method
Product內包括了一個createClone()的method
可以對自身複製出一個instance傳出去,至於實作部分就留給其繼承者實作出來即可
3.多個繼承自Product的class(在這範例是StringBox)

其運作流程為
1.利用Manager註冊Product
2.利用Manager產生Product instance
3.操作Product instance
參與者
1.Manager
本身為標準class,非abstract
但裡面method呼叫的是以抽象類別(Product)所訂的method來執行
在這裡面包含了產生product instance的運算邏輯


public class Manager {
    private Hashtable table=new Hashtable();
    public void register(String name,Product p){
        table.put(name,p); 
    }
    public Product create(String protoname){
    Product p=(Product)table.get(protoname);
        return p.createClone();
    }
}


先使用register把Product與設定要產生這product的字串註冊到這manager內
以後就可以利用註冊的字串用create來取得該product 的instance

2.Product(framework)
規範了在Managaer內會被呼叫的method名稱
public abstract class Product implements Cloneable {
public abstract Product createClone();
public abstract void show(String s);
}
在Java內,Product一定要先implements Cloneable


createClone()就是clone自己產生instance的地方,這部分留給繼承者實作
3.StringBox
public class StringBox extends Product {
    public Product createClone(){
        Product p=null;
        try{
            p=(Product)clone();
        }catch(CloneNotSupportedException e){
            e.printStackTrace();
        }
        return p;
    }
}


4.Main(外部應用程式)


Manager manager=new Manager();//產生manager
manager.register("my-",(Product)new StringBox('-'));//註冊product到manager上
Product p=manager.create("my-");//利用manager產生product instance
p.show("hello world");//操作product

沒有留言: