定義:用原型實例指定創建對象的種類,並且通過拷貝這些原型創建新的對象. Prototype模式允許一個對象再創建另外一個可定制的對象,根本無需知道任何如何創建的細節, 工作原理是:通過將一個原型對象傳給那個要發動創建的對象,這個要發動創建的對象通過請求 原型對象拷貝它們自己來實施創建。 適用性:當要實例化的類是在運行時刻指定時,例如,通過動態裝載;或者 為了避免創建一個與產品類層次平行的工廠類層次時;或者 當一個類的實例只能有幾個不同狀態組合中的一種時。 建立相應數目的原型並克隆它們可能比每次用合適的狀態手工實例化該類更方便一些。 代碼可以說明一切的:代碼部分/************************* * 定義interface *************************/ package meconsea;
/** * *
Title:design in Java
* *Description: 用Prototype來創建一批clone產品
*有關clone的知識請參考另一個blog
* *Copyright: Copyright (c) 2005
* *Company: www.hhzskj.com
* * @author meconsea * @version 1.0 */import Java.io.Serializable;
public interface IPrototypeRam extends Cloneable, Serializable{
/** * 用於bean * @return String */ public String getName();
/** * 用於bean * @param name String */
public void setName(String name);
}
/××××××××××××××××××××××××××××××××××× × 接口的實現 ×××××××××××××××××××××××××××××××××××/ package meconsea;
/** * *
Title:design in Java
* *Description: 用Prototype來創建一批clone產品
*有關clone的知識請參考另一個blog
* *Copyright: Copyright (c) 2005
* *Company: www.hhzskj.com
* * @author meconsea * @version 1.0 */public class PrototypeRam implements IPrototypeRam{
private String name;
public String getName(){ return this.name; } public void setName(String name){ this.name = name; }
public PrototypeRam() { this.name = " this is propotype!"; }
/** * 覆寫clone方法 * @return Object */ public Object clone(){ Object o = null; try{ o = super.clone(); }catch(CloneNotSupportedException e){ System.out.println(" PrototypeRam is not cloneable"); } return o; }}
/××××××××××××××××××××××××××××××××××××××× ×原型管理器部分 ×××××××××××××××××××××××××××××××××××××××/ package meconsea;
/** * *
Title: 原型管理器
* *Description:實現了自動注冊原型的功能
*原型管理器運行時只要一個實例,因此可以用singleton模式來實現.
*有關singleton的參照其他blog.
*Copyright: Copyright (c) 2005
* *Company:www.hhzskj.com
* * @author meconsea * @version 1.0 */import Java.util.HashMap;public class PrototypeManager {
/** * 關於HashMap和HashTable的區別參考其他blog */ private HashMap hm = null;
private static PrototypeManager prototypeManager = null;
private PrototypeManager() { hm = new HashMap(); }
public static synchronized PrototypeManager getPrototypeManager(){ if(prototypeManager == null){ prototypeManager = new PrototypeManager(); } return prototypeManager; }
/** * 注冊 * @param name String * @param prototype Object */ public void register(String name, Object prototype){ hm.put(name,prototype); }
/** * 解除注冊 * @param name String */ public void unRegister(String name){ hm.remove(name); }
/** * 獲得原型實例 * @param name String * @return Object */ public Object getPrototype(String name){ Object o = null; if(hm.containsKey(name)){ o = hm.get(name); }else{ try{ /** * 自動查找原型管理器裡不存在的類,並動態生成它 */ o = Class.forName(name).newInstance(); this.register(name,o); }catch(Exception e){ System.out.println("class "+name+" don't define "+e.getMessage()); e.printStackTrace(); } } return o; }}
/×××××××××××××××××××××××××××××× ×客戶端實現 ×××××××××××××××××××××××××××××/ package meconsea;
/** * *
Title:
* *Description: 客戶端使用prototype模式
* *Copyright: Copyright (c) 2005
* *Company: www.hhzskj.com
* * @author meconsea * @version 1.0 */public class PrototypeClient { PrototypeManager pm = null; public PrototypeClient() { pm = PrototypeManager.getPrototypeManager(); } public static void main(String args[]){ PrototypeClient pc = new PrototypeClIEnt(); String className = null; className = "meconsea.PrototypeRam"; PrototypeRam pr = null; pr = (PrototypeRam)(pc.pm.getPrototype(className)); if(pr != null){ PrototypeRam[] pram; System.out.println(" for loop before PrototypeRam name == "+pr.getName()); pram = new PrototypeRam[10]; for(int i = 0; i < 10; i++){ /** * 生成一批克隆的Ram,並比較他們和原型的不同 */ pram[i] = (PrototypeRam)pr.clone(); System.out.println("loop for PrototypeRam name == "+pram[i].getName()); pram[i].setName(pram[i].getName()+i); System.out.println("clone changes after "+pram[i].getName()+" old "+pr.getName()); } } }}/******************************* *代碼說明了一切吧!^…^ *******************************/