Java設計模式之原型模式的示例詳解
定義
用原型實例指定創建對象的種類,並且通過拷貝這些原型創建新的對象 即實現瞭一個原型接口,該接口用於創建當前對象的克隆,當直接創建對象的代價比較大時,則采用這種模式
案例
需求
張三要打印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(); } }
測試結果
方案二
定義照片類
/** * 照片類 * @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(); } }
測試結果
對比分析
- 方案一:一般實現方法,使用for循環進行多次new實例化照片對象,該方案最多大的優勢就是簡單,容易理解;劣勢就是多次使用new關鍵字,頻繁的進行內存分配等,如果量大到一定的程度,性能會非常差
- 方案二:原型模式實現方法,要實例化多次的類實現Cloneable,重寫clone方法,使用for循環重復調用clone方法進行多次實例化,即是在內存中使用拷貝的方式進行創建對象,性能比new關鍵字會高很多
總結
通過以上兩個方案的耗時比較,我們可以發現使用原型模式創建對象性能最優,所以在以下場景中我們可以選擇使用原型模式:
1.當需要一個類的大量對象的時候
2.如果一個對象初始化太過繁瑣
到此這篇關於Java設計模式之原型模式的示例詳解的文章就介紹到這瞭,更多相關Java原型模式內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!