激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 23種設計模式(3) java原型模式

23種設計模式(3) java原型模式

2021-02-02 11:35阿木俠 Java教程

這篇文章主要為大家詳細介紹了23種設計模式之java原型模式,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

23種設計模式第三篇:java原型模式

定義:

        通過復制現有的對象實例來創建新的對象實例。

實現:

實現Cloneable接口:

        Cloneable接口的作用是在運行時通知虛擬機可以安全地在實現了此接口的類上使用clone方法。在java虛擬機中,只有實現了這個接口的類才可以被拷貝,否則在運行時會拋出CloneNotSupportedException異常。

重寫Object類中的clone方法:

       Java中,所有類的父類都是Object類,Object類中有一個clone方法,作用是返回對象的一個拷貝,但是其作用域protected類型的,一般的類無法調用,因此,原型類需要將clone方法的作用域修改為public類型。

示例:

例如,對于拿郵件發邀請函,郵件類大部分內容都是一樣的:邀請原由、相邀地點,相聚時間等等,但對于被邀請者的名稱和發送的郵件地址是不同的。

定義Mail類:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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.....
}

測試方法:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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屬性。

?
1
2
3
4
5
private String receiver;
private String subject;
private String content;
private String tail;
private ArrayList<String> ars;

此時,單mail = (Mail) super.clone();無法將ars指向的地址區域改變,必須另行拷貝:

?
1
2
3
4
5
6
try {
 mail = (Mail) super.clone();
 mail.ars = (ArrayList<String>)this.ars.clone();
 } catch (CloneNotSupportedException e) {
  e.printStackTrace();
}

適用場景:

1、復制對象的結構和數據。
2、希望對目標對象的修改不影響既有的原型對象。
3、創建一個對象的成本比較大。

轉自:java知音

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 福利在线影院 | 999精品国产| 久久情爱网 | 色综av | 一级大片一级一大片 | 中文字幕电影免费播放 | 日本高清黄色片 | 成人免费淫片视频软件 | 久久精品一区二区三区不卡牛牛 | 久久精品亚洲欧美日韩精品中文字幕 | 成人一级在线 | 精品一区二区久久久久久按摩 | 凹凸成人精品亚洲精品密奴 | www成人在线观看 | 久久精品无码一区二区三区 | 最新中文字幕第一页视频 | 日韩av电影在线免费观看 | 一级免费大片 | 成人毛片100部免费观看 | 最新91在线视频 | 黄色片在线免费播放 | 精品成人久久久 | 久操伊人| 自拍偷拍亚洲图片 | 青草久久网 | 成人三级在线播放 | 国产1区视频 | 欧美大逼网 | 91久久国产露脸精品免费 | 中国免费黄色 | 国av在线 | 成片免费大全 | av老司机久久| 激情综合网俺也去 | 毛片视频网站在线观看 | 99视频有精品 | 色婷婷久久久久久 | 欧美日韩a∨毛片一区 | 国产九九热视频 | 情侣啪啪网站 | 国产1区2区3区中文字幕 |