23種設(shè)計(jì)模式(3) java原型模式
23種設(shè)計(jì)模式第三篇:java原型模式
定義:
通過復(fù)制現(xiàn)有的對(duì)象實(shí)例來創(chuàng)建新的對(duì)象實(shí)例。
實(shí)現(xiàn):
實(shí)現(xiàn)Cloneable接口:
Cloneable接口的作用是在運(yùn)行時(shí)通知虛擬機(jī)可以安全地在實(shí)現(xiàn)了此接口的類上使用clone方法。在java虛擬機(jī)中,只有實(shí)現(xiàn)了這個(gè)接口的類才可以被拷貝,否則在運(yùn)行時(shí)會(huì)拋出CloneNotSupportedException異常。
重寫Object類中的clone方法:
Java中,所有類的父類都是Object類,Object類中有一個(gè)clone方法,作用是返回對(duì)象的一個(gè)拷貝,但是其作用域protected類型的,一般的類無法調(diào)用,因此,原型類需要將clone方法的作用域修改為public類型。
示例:
例如,對(duì)于拿郵件發(fā)邀請(qǐng)函,郵件類大部分內(nèi)容都是一樣的:邀請(qǐng)?jiān)?、相邀地點(diǎn),相聚時(shí)間等等,但對(duì)于被邀請(qǐng)者的名稱和發(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("邀請(qǐng)函(不變)", "婚嫁生日啥的....(不變部分)"); Mail mail = new Mail(et); while (i < MAX_COUNT) { Mail cloneMail = mail.clone(); cloneMail.setContent("XXX先生(女士)(變化部分)" + mail.getTail()); cloneMail.setReceiver("每個(gè)人的郵箱地址...com(變化部分)"); sendMail(cloneMail); i++; } }
優(yōu)點(diǎn):
1、使用原型模型創(chuàng)建一個(gè)對(duì)象比直接new一個(gè)對(duì)象更有效率,因?yàn)樗苯硬僮鲀?nèi)存中的二進(jìn)制流,特別是復(fù)制大對(duì)象時(shí),性能的差別非常明顯。
2、隱藏了制造新實(shí)例的復(fù)雜性,使得創(chuàng)建對(duì)象就像我們?cè)诰庉嬑臋n時(shí)的復(fù)制粘貼一樣簡單。
缺點(diǎn):
1、由于使用原型模式復(fù)制對(duì)象時(shí)不會(huì)調(diào)用類的構(gòu)造方法,所以原型模式無法和單例模式組合使用,因?yàn)樵皖愋枰獙lone方法的作用域修改為public類型,那么單例模式的條件就無法滿足了。
2、使用原型模式時(shí)不能有final對(duì)象。
3、Object類的clone方法只會(huì)拷貝對(duì)象中的基本數(shù)據(jù)類型,對(duì)于數(shù)組,引用對(duì)象等只能另行拷貝。這里涉及到深拷貝和淺拷貝的概念。
深拷貝與淺拷貝:
淺拷貝:
將一個(gè)對(duì)象復(fù)制后,基本數(shù)據(jù)類型的變量都會(huì)重新創(chuàng)建,而引用類型,指向的還是原對(duì)象所指向的(這樣不安全)。
深拷貝:
將一個(gè)對(duì)象復(fù)制后,不論是基本數(shù)據(jù)類型還有引用類型,都是重新創(chuàng)建的。
那么深拷貝如何具體實(shí)現(xiàn)呢?
繼續(xù)上面的例子,增加了一個(gè)ArrayList屬性。
private String receiver; private String subject; private String content; private String tail; private ArrayList<String> ars;
此時(shí),單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ù)制對(duì)象的結(jié)構(gòu)和數(shù)據(jù)。
2、希望對(duì)目標(biāo)對(duì)象的修改不影響既有的原型對(duì)象。
3、創(chuàng)建一個(gè)對(duì)象的成本比較大。
轉(zhuǎn)自:java知音
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Selenium+Tesseract-OCR智能識(shí)別驗(yàn)證碼爬取網(wǎng)頁數(shù)據(jù)的實(shí)例
本文主要介紹了Selenium+Tesseract-OCR智能識(shí)別驗(yàn)證碼爬取網(wǎng)頁數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09LRU算法及Apache?LRUMap源碼實(shí)例解析
這篇文章主要給大家介紹了關(guān)于LRU算法及Apache?LRUMap源碼解析的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-11-11idea64.exe.vmoptions文件如何設(shè)置調(diào)整VM配置文件
這篇文章主要介紹了idea64.exe.vmoptions文件如何設(shè)置調(diào)整VM配置文件問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04maven安裝、使用、配置本地倉庫、idea配置maven以及解決plugins報(bào)錯(cuò)問題
本地倉庫是遠(yuǎn)程倉庫的一個(gè)緩沖和子集,當(dāng)你構(gòu)建Maven項(xiàng)目時(shí)首先會(huì)從本地倉庫查找資源,如果沒有那么Maven會(huì)從遠(yuǎn)程倉庫下載到你本地倉庫,這篇文章主要給大家介紹了關(guān)于maven安裝、使用、配置本地倉庫、idea配置maven以及解決plugins報(bào)錯(cuò)問題的相關(guān)資料,需要的朋友可以參考下2024-01-01講解Java設(shè)計(jì)模式編程中的建造者模式與原型模式
這篇文章主要介紹了Java設(shè)計(jì)模式編程中的建造者模式與原型模式,設(shè)計(jì)模式有利于團(tuán)隊(duì)開發(fā)過程中的代碼維護(hù),需要的朋友可以參考下2016-02-02SpringBoot集成Flink-CDC實(shí)現(xiàn)對(duì)數(shù)據(jù)庫數(shù)據(jù)的監(jiān)聽問題
Flink CDC(Flink Change Data Capture)是一種基于數(shù)據(jù)庫日志的CDC技術(shù),它實(shí)現(xiàn)了一個(gè)全增量一體化的數(shù)據(jù)集成框架,這篇文章主要介紹了SpringBoot集成Flink-CDC,實(shí)現(xiàn)對(duì)數(shù)據(jù)庫數(shù)據(jù)的監(jiān)聽,需要的朋友可以參考下2024-07-07spring schedule配置多任務(wù)動(dòng)態(tài)cron(增刪啟停)
這篇文章主要介紹了spring schedule配置多任務(wù)動(dòng)態(tài)cron(增刪啟停),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03