最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2020年06月28日 15:20:17   作者:阿木俠  
這篇文章主要為大家詳細介紹了23種設(shè)計模式之java原型模式,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

23種設(shè)計模式第三篇:java原型模式

定義:

        通過復(fù)制現(xiàn)有的對象實例來創(chuàng)建新的對象實例。

實現(xiàn):

實現(xiàn)Cloneable接口:

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

重寫Object類中的clone方法:

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

示例:

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

定義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++;
 }

}

優(yōu)點:

 1、使用原型模型創(chuàng)建一個對象比直接new一個對象更有效率,因為它直接操作內(nèi)存中的二進制流,特別是復(fù)制大對象時,性能的差別非常明顯。
2、隱藏了制造新實例的復(fù)雜性,使得創(chuàng)建對象就像我們在編輯文檔時的復(fù)制粘貼一樣簡單。

缺點:

1、由于使用原型模式復(fù)制對象時不會調(diào)用類的構(gòu)造方法,所以原型模式無法和單例模式組合使用,因為原型類需要將clone方法的作用域修改為public類型,那么單例模式的條件就無法滿足了。
2、使用原型模式時不能有final對象。
3、Object類的clone方法只會拷貝對象中的基本數(shù)據(jù)類型,對于數(shù)組,引用對象等只能另行拷貝。這里涉及到深拷貝和淺拷貝的概念。

深拷貝與淺拷貝:

淺拷貝:

將一個對象復(fù)制后,基本數(shù)據(jù)類型的變量都會重新創(chuàng)建,而引用類型,指向的還是原對象所指向的(這樣不安全)。

深拷貝:

將一個對象復(fù)制后,不論是基本數(shù)據(jù)類型還有引用類型,都是重新創(chuàng)建的。

那么深拷貝如何具體實現(xiàn)呢?

繼續(xù)上面的例子,增加了一個ArrayList屬性。

private String receiver;
private String subject;
private String content;
private String tail;
private ArrayList<String> ars;

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

try {
 mail = (Mail) super.clone(); 
 mail.ars = (ArrayList<String>)this.ars.clone();
 } catch (CloneNotSupportedException e) {
  e.printStackTrace();
}

適用場景:

1、復(fù)制對象的結(jié)構(gòu)和數(shù)據(jù)。
2、希望對目標對象的修改不影響既有的原型對象。
3、創(chuàng)建一個對象的成本比較大。

轉(zhuǎn)自:java知音

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java?SSM實現(xiàn)前后端協(xié)議聯(lián)調(diào)詳解下篇

    Java?SSM實現(xiàn)前后端協(xié)議聯(lián)調(diào)詳解下篇

    首先我們已經(jīng)知道,在現(xiàn)在流行的“前后端完全分離”架構(gòu)中,前后端聯(lián)調(diào)是一個不可能避免的問題,這篇文章主要介紹了Java?SSM實現(xiàn)前后端協(xié)議聯(lián)調(diào)過程
    2022-08-08
  • 教你怎么用Springboot自定義Banner圖案

    教你怎么用Springboot自定義Banner圖案

    今天給大家?guī)淼氖荍ava的相關(guān)知識,文章圍繞著怎么用Springboot自定義Banner圖案展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 結(jié)合mybatis-plus實現(xiàn)簡單不需要寫sql的多表查詢

    結(jié)合mybatis-plus實現(xiàn)簡單不需要寫sql的多表查詢

    這篇文章主要給大家介紹了關(guān)于結(jié)合mybatis-plus實現(xiàn)簡單不需要寫sql的多表查詢的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用mybatis-plus具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • BaseDao封裝JavaWeb的增刪改查的實現(xiàn)代碼

    BaseDao封裝JavaWeb的增刪改查的實現(xiàn)代碼

    Basedao 是一種基于數(shù)據(jù)訪問對象(Data Access Object)模式的設(shè)計方法,它是一個用于處理數(shù)據(jù)庫操作的基礎(chǔ)類,負責(zé)封裝數(shù)據(jù)庫訪問的底層操作,提供通用的數(shù)據(jù)庫訪問方法,本文給大家介紹了BaseDao封裝JavaWeb的增刪改查的實現(xiàn)代碼,需要的朋友可以參考下
    2024-03-03
  • java POI 如何實現(xiàn)Excel單元格內(nèi)容換行

    java POI 如何實現(xiàn)Excel單元格內(nèi)容換行

    這篇文章主要介紹了java POI 如何實現(xiàn)Excel單元格內(nèi)容換行的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • java Swing布局管理之BoxLayout布局

    java Swing布局管理之BoxLayout布局

    這篇文章主要為大家詳細介紹了java Swing布局管理之BoxLayout布局的相關(guān)資料,感興趣的小伙伴們可以參考一下
    2016-05-05
  • 深入解析Java的Spring框架中的混合事務(wù)與bean的區(qū)分

    深入解析Java的Spring框架中的混合事務(wù)與bean的區(qū)分

    這篇文章主要介紹了Java的Spring框架中的混合事務(wù)與bean的區(qū)分,Spring是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下
    2016-01-01
  • 基于java實現(xiàn)人機猜拳游戲

    基于java實現(xiàn)人機猜拳游戲

    這篇文章主要為大家詳細介紹了基于java實現(xiàn)人機猜拳游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • springboot亂碼問題排查思路解析

    springboot亂碼問題排查思路解析

    這篇文章主要為大家介紹了springboot亂碼問題排查思路解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • Java Collections類操作集合詳解

    Java Collections類操作集合詳解

    這篇文章主要介紹了Java Collections類操作集合詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01

最新評論

新乡县| 屏山县| 新疆| 曲松县| 刚察县| 正安县| 和政县| 青岛市| 佛山市| 长春市| 平阴县| 南昌县| 阳春市| 锡林浩特市| 巴林左旗| 延津县| 博乐市| 宿州市| 洛川县| 淮南市| 合肥市| 右玉县| 澄城县| 晴隆县| 黔西县| 泉州市| 琼结县| 斗六市| 嘉祥县| 收藏| 阿克陶县| 石屏县| 德钦县| 浪卡子县| 濮阳县| 中卫市| 拉萨市| 多伦县| 遂川县| 岳池县| 永宁县|