您好,登錄后才能下訂單哦!
這篇文章主要講解了“java原型模式如何實現”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“java原型模式如何實現”吧!
定義:
通過復制現有的對象實例來創建新的對象實例。
實現:
實現Cloneable接口:
Cloneable接口的作用是在運行時通知虛擬機可以安全地在實現了此接口的類上使用clone方法。在java虛擬機中,只有實現了這個接口的類才可以被拷貝,否則在運行時會拋出CloneNotSupportedException異常。
重寫Object類中的clone方法:
Java中,所有類的父類都是Object類,Object類中有一個clone方法,作用是返回對象的一個拷貝,但是其作用域protected類型的,一般的類無法調用,因此,原型類需要將clone方法的作用域修改為public類型。
示例:
例如,對于拿郵件發邀請函,郵件類大部分內容都是一樣的:邀請原由、相邀地點,相聚時間等等,但對于被邀請者的名稱和發送的郵件地址是不同的。
定義Mail類:
public class Mail implements Cloneable {
private String receiver;
private String subject;
private String content;
private String tail;
public Mail(EventTemplate et) {
this.tail = et.geteventContent();
this.subject = et.geteventSubject();
}
@Override
public Mail clone() {
Mail mail = null;
try {
mail = (Mail) super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} return mail;
}
//get、set.....
}
測試方法:
public static void main(String[] args) {
int i = 0;
int MAX_COUNT = 10;
EventTemplate et =
new EventTemplate("邀請函(不變)", "婚嫁生日啥的....(不變部分)");
Mail mail = new Mail(et);
while (i < MAX_COUNT) {
Mail cloneMail = mail.clone();
cloneMail.setContent("XXX先生(女士)(變化部分)"
+ mail.getTail());
cloneMail.setReceiver("每個人的郵箱地址...com(變化部分)");
sendMail(cloneMail);
i++;
}
}
優點:
1,使用原型模型創建一個對象比直接new一個對象更有效率,因為它直接操作內存中的二進制流,特別是復制大對象時,性能的差別非常明顯。
2,隱藏了制造新實例的復雜性,使得創建對象就像我們在編輯文檔時的復制粘貼一樣簡單。
缺點:
1,由于使用原型模式復制對象時不會調用類的構造方法,所以原型模式無法和單例模式組合使用,因為原型類需要將clone方法的作用域修改為public類型,那么單例模式的條件就無法滿足了。
2,使用原型模式時不能有final對象。
3,Object類的clone方法只會拷貝對象中的基本數據類型,對于數組,引用對象等只能另行拷貝。這里涉及到深拷貝和淺拷貝的概念。
深拷貝與淺拷貝:
淺拷貝:
將一個對象復制后,基本數據類型的變量都會重新創建,而引用類型,指向的還是原對象所指向的(這樣不安全)。
深拷貝:
將一個對象復制后,不論是基本數據類型還有引用類型,都是重新創建的。
那么深拷貝如何具體實現呢?
繼續上面的例子,增加了一個ArrayList屬性。
private String receiver;
private String subject;
private String content;
private String tail;
private ArrayList<String> ars;
此時,單mail = (Mail) super.clone();無法將ars指向的地址區域改變,必須另行拷貝:
try {
mail = (Mail) super.clone();
mail.ars = (ArrayList<String>)this.ars.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
適用場景:
1,復制對象的結構和數據。
2,希望對目標對象的修改不影響既有的原型對象。
3,創建一個對象的成本比較大。
感謝各位的閱讀,以上就是“java原型模式如何實現”的內容了,經過本文的學習后,相信大家對java原型模式如何實現這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。