Java設(shè)計模式之原型模式的示例詳解
定義
用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象 即實現(xiàn)了一個原型接口,該接口用于創(chuàng)建當(dāng)前對象的克隆,當(dāng)直接創(chuàng)建對象的代價比較大時,則采用這種模式
案例
需求
張三要打印100000份照片
方案一
定義照片類
/** * 照片類 * @author:liyajie * @createTime:2022/2/15 11:47 * @version:1.0 */ @Data @AllArgsConstructor public class Photo { private String name; private String type; private int size; }
定義客戶端類
/** * 客戶端 * @author:liyajie * @createTime:2022/2/15 11:49 * @version:1.0 */ public class Client { public void printPhoto(){ Photo photo = new Photo("張三","彩色",2); for (int i = 0; i < 100000; i++) { Photo clone = new Photo(photo.getName(),photo.getType(),photo.getSize()); System.out.println(clone); } } }
定義測試類
/** * 測試類 * @author:liyajie * @createTime:2022/2/15 11:51 * @version:1.0 */ public class Test { public static void main(String[] args) { Client client = new Client(); client.printPhoto(); } }
測試結(jié)果
方案二
定義照片類
/** * 照片類 * @author:liyajie * @createTime:2022/2/15 11:47 * @version:1.0 */ @Data @AllArgsConstructor public class PhotoNew implements Cloneable{ private String name; private String type; private int size; @Override protected PhotoNew clone() { PhotoNew clone = null; try { clone = (PhotoNew)super.clone(); }catch (Exception e){ e.printStackTrace(); } return clone; } }
定義客戶端類
/** * 客戶端 * @author:liyajie * @createTime:2022/2/15 11:49 * @version:1.0 */ public class ClientNew { public void printPhoto(){ PhotoNew photoNew = new PhotoNew("張三","彩色",2); for (int i = 0; i < 100000; i++) { PhotoNew clone = photoNew.clone(); System.out.println(clone); } } }
定義測試類
/** * 測試類 * @author:liyajie * @createTime:2022/2/15 11:51 * @version:1.0 */ public class TestNew { public static void main(String[] args) { ClientNew clientNew = new ClientNew(); clientNew.printPhoto(); } }
測試結(jié)果
對比分析
- 方案一:一般實現(xiàn)方法,使用for循環(huán)進(jìn)行多次new實例化照片對象,該方案最多大的優(yōu)勢就是簡單,容易理解;劣勢就是多次使用new關(guān)鍵字,頻繁的進(jìn)行內(nèi)存分配等,如果量大到一定的程度,性能會非常差
- 方案二:原型模式實現(xiàn)方法,要實例化多次的類實現(xiàn)Cloneable,重寫clone方法,使用for循環(huán)重復(fù)調(diào)用clone方法進(jìn)行多次實例化,即是在內(nèi)存中使用拷貝的方式進(jìn)行創(chuàng)建對象,性能比new關(guān)鍵字會高很多
總結(jié)
通過以上兩個方案的耗時比較,我們可以發(fā)現(xiàn)使用原型模式創(chuàng)建對象性能最優(yōu),所以在以下場景中我們可以選擇使用原型模式:
1.當(dāng)需要一個類的大量對象的時候
2.如果一個對象初始化太過繁瑣
到此這篇關(guān)于Java設(shè)計模式之原型模式的示例詳解的文章就介紹到這了,更多相關(guān)Java原型模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Ehcache簡介_動力節(jié)點Java學(xué)院整理
這篇文章主要介紹了Ehcache簡介,使用Spring的AOP進(jìn)行整合,可以靈活的對方法的返回結(jié)果對象進(jìn)行緩存2017-07-07詳解Spring boot Admin 使用eureka監(jiān)控服務(wù)
本篇文章主要介紹了詳解Spring boot Admin 使用eureka監(jiān)控服務(wù),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-12-12Spring動態(tài)添加定時任務(wù)的實現(xiàn)思路
這篇文章主要介紹了Spring動態(tài)添加定時任務(wù)的實現(xiàn)思路,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-07-07Java編程實現(xiàn)統(tǒng)計一個字符串中各個字符出現(xiàn)次數(shù)的方法
這篇文章主要介紹了Java編程實現(xiàn)統(tǒng)計一個字符串中各個字符出現(xiàn)次數(shù)的方法,涉及java針對字符串的遍歷、判斷、運算等相關(guān)操作技巧,需要的朋友可以參考下2017-12-12Spring三級緩存思想解決循環(huán)依賴總結(jié)分析
這篇文章主要為大家介紹了Spring三級緩存思想解決循環(huán)依賴總結(jié)分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08Java如何將二維數(shù)組轉(zhuǎn)化為一維數(shù)組
這篇文章主要介紹了Java如何將二維數(shù)組轉(zhuǎn)化為一維數(shù)組,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08詳解如何使用IntelliJ IDEA新建一個Servlet項目
這篇文章主要介紹了詳解如何使用IntelliJ IDEA新建一個Servlet項目,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-11-11java初學(xué)者如何讓編程學(xué)習(xí)起來更簡單
我們給大家?guī)硪黄P(guān)于java初學(xué)者如何讓編程學(xué)習(xí)起來更簡單的基礎(chǔ)性文章,有需要的朋友們可以學(xué)習(xí)下。2020-11-11