標籤:style blog http java color strong io width
概述
用原型執行個體指定建立對象的種類,並且通過拷貝這些原型建立新的對象。
原型模式屬於對象的建立模式。通過給出一個原型對象來指明所有建立的對象的類型,然後用複製這個原型對象的辦法建立出更多同類型的對象。這就是選型模式的用意。
原型模式要求對象實現一個可以“複製”自身的介面,這樣就可以通過複製一個執行個體對象本身來建立一個新的執行個體。這樣一來,通過原型執行個體建立新的對象,就不再需要關心這個執行個體本身的類型,只要實現了複製自身的方法,就可以通過這個方法來擷取新的對象,而無須再去通過new來建立。
類圖
代碼
以通過群發郵件的例子說明一下:
public class Mail implements Cloneable { private String receiver; private String subject; private String appellation; private String contxt; private String tail; public Mail(String subject, String contxt) { super(); this.subject = subject; this.contxt = contxt; } public String getReceiver() { return receiver; } public void setReceiver(String receiver) { this.receiver = receiver; } public String getAppellation() { return appellation; } public void setAppellation(String appellation) { this.appellation = appellation; } public String getTail() { return tail; } public void setTail(String tail) { this.tail = tail; } public String getSubject() { return subject; } public String getContxt() { return contxt; } public Mail clone() { Mail mail = null; try { mail = (Mail) super.clone(); } catch (CloneNotSupportedException e) { // TODO 自動產生的 catch 塊 e.printStackTrace(); } return mail; } }
public class ClientDemo { private static int MAX_COUNT = 6; public static void main(String[] args) { int i =0; Mail mail = new Mail("群發標題","群發內容"); mail.setTail("群髮結尾"); Random rand = new Random(); while(i < MAX_COUNT) { Mail cloneMail = mail.clone(); cloneMail.setAppellation("尊稱"+rand.nextInt(100)+":"); cloneMail.setReceiver(rand.nextInt(1000000000)+"@qq.com"); sendMail(cloneMail); i++; } } public static void sendMail(Mail mail) { System.out.println("標題:"+mail.getSubject()+"\t收件者:"+mail.getReceiver()+"\t.....發送成功"); }}
複製必須滿足的條件
a.對任何的對象x,都有:x.clone() != x,即複製對象與原對象不是同一個對象。
b.對任何的對象x,都有:x.clone().getClass() == x.get getClass(),即複製對象與原對象的類型是一樣的。
c.如果對象x的equals()方法定義恰當的話,那麼x.clone().equals(x)應當是成立的。
淺複製:複製了實值型別對象,對於參考型別對象,只複製了引用,它指向原來引用的對象。Java中clone為淺複製。
深複製:對實值型別和參考型別的對象都產生一份新的拷貝. Java中可以通過序列化來進行深複製,前提是對象以及對象內部所引用的對象都是可序列化的,否則需要考慮將那些不可序列化的對象可否設為transient,排除在複製過程之外。
我是天王蓋地虎的分割線
原始碼:http://pan.baidu.com/s/1dD1Qx01
java原型.zip