設(shè)計(jì)模式:創(chuàng)建模式之Prototype(原型)
Posted on 2007-05-29 15:43 zht 閱讀(964) 評(píng)論(0) 編輯 收藏 所屬分類: 設(shè)計(jì)模式復(fù)制產(chǎn)生對(duì)象實(shí)例:
使用Prototype模式可以理解為 創(chuàng)造出一個(gè)和已有對(duì)象一樣的對(duì)象
ex)指著面包店櫥窗里的面包告訴老板 我就要這個(gè) 雖然不知道名字 也不知道做法 但是能買到和所指的相同的東西。
實(shí)例:
1、定義一個(gè)接口 實(shí)現(xiàn)Cloneable
public interface Product extends Cloneable {
public abstract void use(String s);
public abstract Product createClone();
}
2、聲明一個(gè)manage類來(lái)根據(jù)Product的createClone來(lái)進(jìn)行復(fù)制
public class Manager {
private Hashtable showcase = new Hashtable();
public void register(String name, Product proto) {
showcase.put(name, proto);
}
public Product create(String protoname) {
Product p = (Product)showcase.get(protoname);
return p.createClone();
}
}
3、Product類的一個(gè)具體實(shí)現(xiàn)
public class UnderlinePen implements Product {
private char ulchar;
public UnderlinePen(char ulchar) {
this.ulchar = ulchar;
}
public void use(String s) {
int length = s.getBytes().length;
System.out.println("\"" + s + "\"");
System.out.print(" ");
for (int i = 0; i < length; i++) {
System.out.print(ulchar);
}
System.out.println("");
}
public Product createClone() {
Product p = null;
try {
p = (Product)clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return p;
}
}
4、具體使用
// 預(yù)備階段
Manager manager = new Manager();
UnderlinePen upen = new UnderlinePen('~');
MessageBox mbox = new MessageBox('*');
MessageBox sbox = new MessageBox('/');
manager.register("strong message", upen);
manager.register("warning box", mbox);
manager.register("slash box", sbox);
// 實(shí)現(xiàn)產(chǎn)生
Product p1 = manager.create("strong message");
p1.use("Hello, world.");
Product p2 = manager.create("warning box");
p2.use("Hello, world.");
Product p3 = manager.create("slash box");
p3.use("Hello, world.");
}
也可以將product聲明成抽象類實(shí)現(xiàn)Cloneable接口
并且實(shí)現(xiàn)createClone方法
這樣子類中就不用再聲明creatClone方法了 簡(jiǎn)化了代碼
clone方法在Object中定義 因此所有類都會(huì)繼承clone()方法
Cloneable這個(gè)接口表示 可用clone()方法進(jìn)行復(fù)制
clone()方法做的是淺拷貝 所做的操作是直接復(fù)制字段內(nèi)容 并不管該字段對(duì)應(yīng)的對(duì)象實(shí)例內(nèi)容 假定有一個(gè)數(shù)組 當(dāng)使用clone方法進(jìn)行拷貝以后 復(fù)制的結(jié)果,只是對(duì)應(yīng)到該數(shù)組的參照 即指向該數(shù)組的內(nèi)存地址 如果想做深拷貝 必須重寫clone方法 記得要加上super.clone()