設計模式之--原型模式

1.原型模式定義

原型模式非常簡單,定義如下:

用原型實例指定創建對象的種類,并且通過拷貝這些原型創建新的對象

2.通用類圖

原型模式的核心是實現Cloneable接口,此接口為JDK提供的一個標識接口,只有實現了此接口的類才能被拷貝。
原型模式的通用類圖如下;
929184-20180901102215005-401900953.png

3.通用原型實現代碼

原型類:

public class ConcretePrototype implements Cloneable {private int id;private String name;public ConcretePrototype() {System.out.println("ConcretePrototype construct.");}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overrideprotected Object clone() throws CloneNotSupportedException {ConcretePrototype concretePrototype = null;try {concretePrototype = (ConcretePrototype) super.clone();} catch (Exception e) {}return concretePrototype;}@Overridepublic String toString() {return "ConcretePrototype{" +"id=" + id +", name='" + name + '\'' +'}';}
}

Client測試代碼:

public class Client {public static void main(String[] args) throws Exception {ConcretePrototype concretePrototype = new ConcretePrototype();concretePrototype.setId(123);concretePrototype.setName("test");ConcretePrototype cloneType = (ConcretePrototype) concretePrototype.clone();cloneType.setId(111);cloneType.setName("test111");System.out.println(concretePrototype);System.out.println(cloneType);}
}

輸出結果如下:

ConcretePrototype construct.
ConcretePrototype{id=123, name='test'}
ConcretePrototype{id=111, name='test111'}

通過輸出結果可以看出,通過clone方法拷貝了一個新的對象。

4.原型模式的優點

1.性能優良
原型模式是在內存中二進制流的拷貝,要比直接new一個對象快的多

2.通過3中的輸出結果來看,在clone對象的時候構造函數不會執行,這對于一些需要在構造函數中做一些初始化的類來說可能稱為約束

5.需要注意的點

在原型模式拷貝的時候需要注意可變引用類型的屬性,下面通過一個例子來說明此問題:
拷貝對象:

public class DeepClone implements Cloneable{private Map<String, Object> map = new HashMap<>();public void addPair(String key, String value){map.put(key, value);}public Map<String , Object> getMap(){return map;}@Overrideprotected Object clone() throws CloneNotSupportedException {DeepClone  deepClone = null;try {deepClone = (DeepClone) super.clone();} catch (Exception e) {}return deepClone;}
}

Client類

public class Client {public static void main(String[] args) throws Exception {DeepClone deepClone = new DeepClone();deepClone.addPair("key1", "value1");DeepClone clone = (DeepClone) deepClone.clone();clone.addPair("key2", "value2");System.out.println(deepClone.getMap());}}

輸出結果如下:

{key1=value1, key2=value2}

在使用clone方法拷貝對象的時候引用類型的屬性不會繼續做拷貝,而是多個拷貝對象使用同一個屬性,這種被稱為淺拷貝。
下面對clone方法重寫完成深拷貝:

@Override
protected Object clone() throws CloneNotSupportedException {DeepClone  deepClone = null;try {deepClone = (DeepClone) super.clone();Map<String, Object> cloneMap = new HashMap<>();cloneMap.putAll(this.map);deepClone.map = cloneMap;} catch (Exception e) {}return deepClone;
}

重新執行client輸出結果為:

{key1=value1}

轉載于:https://www.cnblogs.com/vitasyuan/p/9569404.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/277370.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/277370.shtml
英文地址,請注明出處:http://en.pswp.cn/news/277370.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

搜索目錄里所有文件(包括子目錄)

搜索目錄里所有文件(包括子目錄&#xff09; 資料來源&#xff1a;http://www.cnblogs.com/jjwwww/archive/2004/09/04/39559.aspx 用到兩個函數ParseDirectory 和CreatePathListvoidParseDirectory(stringpath, stringfilter) { strin…

一張圖理解buffer與cache

轉載于:https://blog.51cto.com/11193863/2169166

oracle服務器不識別tc服務,記一次ORACLE無法啟動登陸事故

打開XSHELL 登陸ORACLE用戶1.sqlplus scott/scott 提示登陸失敗2.sqplus / as sysdba 啟動數據庫提示3.查找日志操作日志&#xff1a;$ORACLE_HOME/startup.log啟動日志&#xff1a;$ORACLE_BASE/diag/rdbms/ora11g/ora11g/trace/alert_ora11g.log (ora11g為SID值)啟動日志如果…

重構(Refactoring)技巧讀書筆記 之二

重構&#xff08;Refactoring&#xff09;技巧讀書筆記 之二<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />General Refactoring Tips, Part 2本文繼續《重構&#xff08;Refactoring&#xff09;技巧讀書筆記 之一》&#xff…

史上最全的Angular.js 的學習資源

Angular.js 的一些學習資源 基礎 官方&#xff1a; http://docs.angularjs.org angularjs官方網站已被墻&#xff0c;可看 http://www.ngnice.com/&#xff1b;官方zip下載包 http://best.factj.com/dolymood/angular-packages&#xff0c;已增加docs服務&#xff0c;輸入地址即…

BMP位圖之8位位圖(三)

起始結構 typedef struct tagBITMAPFILEHEADER { WORD bfType; //類型名&#xff0c;字符串“BM”&#xff0c; DWORD bfSize; //文件大小 WORD bfReserved1; //保留字 WORD bfReserved2; //保留字 DWORD bfOffBits; //實際位圖數據的偏移字節數&#xff0c;即前三個部分長度之…

DNN 漢化中的問題????

今天看到了一份已經漢化過的DNN但是比較奇怪&#xff0c;當第一次運行后我所指定的新數據庫中并沒有添加新的內容&#xff0c;但是網站上的確是已經漢化過了的&#xff0c;不知道它把漢化的內容放到了哪里&#xff1f;&#xff1f;&#xff1f; 另外他所漢化界面的地方&#x…

php 打印對象詳細信息,php打印顯示數組與對象的函數詳解

php打印顯示數組與對象的函數詳解發布于 2014-11-17 18:55:49 | 699 次閱讀 | 評論: 0 | 來源: 網友投遞PHP開源腳本語言PHP(外文名: Hypertext Preprocessor&#xff0c;中文名&#xff1a;“超文本預處理器”)是一種通用開源腳本語言。語法吸收了C語言、Java和Perl的特點&…

ios開發-調用系統自帶手勢

在 iPhone 或 iPad 的開發中&#xff0c;除了用 touchesBegan / touchesMoved / touchesEnded 這組方法來控制使用者的手指觸控外&#xff0c;也可以用 UIGestureRecognizer 的衍生類別來進行判斷。用 UIGestureRecognizer 的好處在于有現成的手勢&#xff0c;開發者不用自己計…

Node.js 事件循環

Node.js 事件循環 Node.js 是單進程單線程應用程序&#xff0c;但是因為 V8 引擎提供的異步執行回調接口&#xff0c;通過這些接口可以處理大量的并發&#xff0c;所以性能非常高。 Node.js 幾乎每一個 API 都是支持回調函數的。 Node.js 基本上所有的事件機制都是用設計模式中…

全國翻譯專業資格(水平)考試

http://www.spta.gov.cn/moreksxx.jsp?lmCodeA02010205轉載于:https://www.cnblogs.com/Danilo/archive/2004/10/31/58821.html

linux文件句柄,【LINUX】使用lsof處理文件恢復、句柄以及空間釋放問題

曾經在生產上遇到過一個df 和 du出現的結果不一致的問題&#xff0c;為了排查到底是哪個進程占用了文件句柄&#xff0c;導致空間未釋放&#xff0c;首先在linux上面&#xff0c;一切皆文件&#xff0c;這個問題可以使用lsof這個BT的命令來處理(這個哈還可以來查詢文件句柄泄露…

android天氣查詢(二)之網絡json數據的獲取

前面一篇文章介紹了如何使用ksoap獲取天氣信息&#xff0c;但是使用的網絡資源受到了限制&#xff0c;所以我們這里會采用第二種方法&#xff0c;可以無限制的獲取。http://m.weather.com.cn/data/101010100.html 但是對應的101010100(北京)我們怎么獲取呢&#xff0c;還有就是…

累.....

今天我真的蔫了&#xff0c;好累&#xff0c;腦子也好濁&#xff0c;但是還好&#xff0c;最終達到了預期的目的。我終于把henry的dataGrid實現了&#xff0c;犯了低級錯誤&#xff0c;和好多人討論&#xff0c;但最終還是henry解決的。那一刻&#xff0c;真的好爽&#xff0c;…

001-pro ant design 升級2.0后變更

一、更新點 1、目錄調整 2、本地代理服務器調整 roadhog→umi 配置方式 在這個config/config.js配置 "proxy": { "/api": { "target": "http://jsonplaceholder.typicode.com/", "changeOrigin": true, "pathRewrite&q…

linux cp 時 略過文件,CentOS下執行cp命令式提示略過文件夾

今天在CentOS下復制一個文件夾到另一個文件夾的時候cp ./res /usr 的時候出現了問題&#xff0c;提示我的是&#xff1a;cp略過了文件夾后來我找了一下在網上search了一下CP命令的用法&#xff1a;CP命令該命令的功能是將給出的文件或目錄拷貝到另一文件或目錄中&#xff0c;同…

屬性頁中的ON_UPDATE_COMMAND_UI

我前面翻譯了一篇文章簡單的談了一下在對話框處理ON_UPDATE_COMMAND_UI 消息。又在www.codeguru.com上看到在屬性頁中處理ON_UPDATE_COMMAND_UI 消息的方法和在對話框中稍有不同。兩者的處理大體上一樣。只是在屬性頁中還需要一個步驟。需要從CPropertySheet派生類&#xff0c;…

linux基礎命令rpm,rpm常用命令集合1

提要&#xff1a;RPM 是 Red Hat Package Manager 的縮寫&#xff0c;原意是Red Hat 軟件包管理&#xff1b;本文介紹RPM&#xff0c;并結合實例來解說RPM手工安裝、查詢等應用&#xff1b;正文&#xff1a;RPM包管理的用途&#xff1b;1、可以安裝、刪除、升級和管理軟件&…

hibernate詳解

Hibernate原理與應用 主要內容 1、引入 2、安裝配置 3、基本概念和CURD 4、HQL和Criteria 5、關聯映射 6、繼承映射 7、集合映射 8、懶加載 9、緩存 10、事務 11、其他 12、Hibernate不適合的場景 13、與JPA的集成(annotation方式) 14、最佳實踐 1、引入 模型不匹配(阻抗不匹配…

Csharp+Asp.net系列教程(四)

邁克老貓 來自&#xff1a;老貓的理想 本教程參考C#和ASP.NET程序設計教程撰寫&#xff0c;有什么不足之處請大家指出&#xff0c;或在老貓的理想BLOG留言。 這次簡述一下操作符 1.算術操作符 算術操作符包括加()、減(-)、乘(*)、除(/)和求余(%)。加減操作符…