05.原型模式:從影分身術到細胞分裂的編程藝術

目錄

    • 序幕:當復制對象成為戰略需求
    • 一、原型工廠的核心裝備庫
      • 1.1 Java原生的淺克隆術
    • 二、深度克隆的煉金法則
      • 2.1 手工克隆大法(硬核派)
      • 2.2 序列化克隆術(魔法派)
    • 三、原型模式的工業級裝配
      • 3.1 原型注冊管理局
      • 3.2 Spring框架中的原型容器
    • 四、原型模式的性能實驗室
      • 4.1 克隆 vs New性能對決
    • 五、原型模式三十六計
      • 5.1 淺克隆適用場景
      • 5.2 深克隆必備場景
      • 5.3 模式選擇決策樹
    • 終章:復制之術的哲學思考

序幕:當復制對象成為戰略需求

🎮 游戲開發現場
你需要快速生成1000個外形相同但位置不同的敵人,直接new對象導致內存飆升?文檔編輯器需要支持"無限撤銷"功能,如何保存編輯狀態的每一幀?這些場景都需要深諳"復制之道"的原型模式來破局!


一、原型工廠的核心裝備庫

1.1 Java原生的淺克隆術

// 基礎忍者原型
public class Ninja implements Cloneable {private String name;private Weapon weapon; // 引用對象共享public Ninja(String name, Weapon weapon) {this.name = name;this.weapon = weapon;}@Overridepublic Ninja clone() {try {return (Ninja) super.clone(); // 淺克隆} catch (CloneNotSupportedException e) {throw new AssertionError();}}
}// 測試影分身效果
Ninji naruto = new Ninja("鳴人", new Kunai());
Ninja shadowClone = naruto.clone();System.out.println(naruto == shadowClone); // false
System.out.println(naruto.weapon == shadowClone.weapon); // true ?

淺克隆缺陷警告

  • 引用類型共享導致意外修改
  • 嵌套對象無法實現真正隔離
  • 需要人工遞歸克隆對象樹

二、深度克隆的煉金法則

2.1 手工克隆大法(硬核派)

// 深克隆示例
public class DeepNinja implements Cloneable {private String name;private Weapon weapon;@Overridepublic DeepNinja clone() {DeepNinja clone = (DeepNinja) super.clone();clone.weapon = this.weapon.clone(); // 武器也要克隆return clone;}
}// 武器類的克隆支持
public class Weapon implements Cloneable {private String type;@Overridepublic Weapon clone() {try {return (Weapon) super.clone();} catch (CloneNotSupportedException e) {throw new AssertionError();}}
}

2.2 序列化克隆術(魔法派)

// 基于序列化的深克隆工具
public class CloneUtils {@SuppressWarnings("unchecked")public static <T extends Serializable> T deepClone(T obj) {try (ByteArrayOutputStream bos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(bos)) {oos.writeObject(obj);try (ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bis)) {return (T) ois.readObject();}} catch (IOException | ClassNotFoundException e) {throw new RuntimeException("克隆失敗", e);}}
}// 測試魔法克隆
Ninja sasuke = new Ninja("佐助", new Sword());
Ninja cloneArmy = CloneUtils.deepClone(sasuke); 

三、原型模式的工業級裝配

3.1 原型注冊管理局

// 原型管理器
public class PrototypeRegistry {private static Map<String, Ninja> prototypes = new HashMap<>();static {prototypes.put("naruto", new Ninja("鳴人", new Rasengan()));prototypes.put("sakura", new Ninja("小櫻", new MedicalSeal()));}public static Ninja getClone(String key) {return prototypes.get(key).clone();}public static void addPrototype(String key, Ninja ninja) {prototypes.put(key, ninja);}
}// 快速生成克隆軍團
Ninja army1 = PrototypeRegistry.getClone("naruto");
Ninja army2 = PrototypeRegistry.getClone("sakura");

3.2 Spring框架中的原型容器

// 原型Bean定義
@Component
@Scope(scopeName = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class ReportPrototype {private byte[] content;public void loadData(File file) {// 加載大文件到內存...}
}// 使用時獲取新實例
public class ReportService {@Autowiredprivate ApplicationContext context;public void generateReport() {ReportPrototype report = context.getBean(ReportPrototype.class);report.loadData(new File("data.xlsx"));// 使用完自動回收...}
}

四、原型模式的性能實驗室

4.1 克隆 vs New性能對決

// 測試代碼框架
long start = System.nanoTime();
for (int i = 0; i < 10000; i++) {// 方案A: new Ninja(...)// 方案B: prototype.clone()
}
long duration = System.nanoTime() - start;

測試結果對比(復雜對象創建場景):

操作方式耗時(納秒)內存占用(MB)
new352,000145
clone78,00062

結論

  • 對象構造越復雜,克隆優勢越明顯
  • 簡單對象反而可能new更快

五、原型模式三十六計

5.1 淺克隆適用場景

  • 需要輕量級對象復制
  • 確定所有引用都是不可變對象
  • 需要與原型共享某些狀態

5.2 深克隆必備場景

  • 原型包含可變引用對象
  • 需要完全隔離副本與原型
  • 原型中存在集合或嵌套結構

5.3 模式選擇決策樹

Yes
No
Yes
Yes
No
需要創建對象副本?
對象是否包含可變引用?
使用淺克隆
使用深克隆
確認是否接受引用共享
完成

終章:復制之術的哲學思考

設計啟示

  1. 克隆不是銀彈,要評估對象復雜度
  2. 深克隆可能引發"遞歸地獄"陷阱
  3. 原型注冊表可以成為系統單點故障

性能警鐘

// 錯誤!每次深克隆大文件對象
public class ReportService {private Report hugeReport; // 100MB的報表對象public Report createReport() {return CloneUtils.deepClone(hugeReport); // 災難性性能!}
}

專家挑戰
當你的原型對象包含網絡連接(Socket)這類不可序列化的資源時,如何實現安全的深克隆?把你的解決方案寫在評論區!

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

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

相關文章

[NLP]如何在 Synopsys VCS 仿真腳本中處理多個 UPF 文件的加載

如何在 Synopsys VCS 仿真腳本中處理多個 UPF 文件的加載 摘要:我將詳細解釋在 Synopsys VCS(VCS)模擬腳本中如何處理多個 UPF 文件的加載,包括原理、命令選項、示例腳本以及注意事項。這基于 VCS 的 native low power verification 支持(IEEE 1801 UPF 標準)。如…

DNF: Decouple and Feedback Network for Seeing in the Dark

DNF&#xff1a;用于暗光視覺的解耦與反饋網絡 摘要 RAW 數據的獨特屬性在低光照圖像增強方面展現出巨大潛力。然而&#xff0c;現有架構在單階段和多階段方法中的固有局限性限制了其性能。跨兩個不同域&#xff08;噪聲到干凈和 RAW 到 sRGB&#xff09;的混合映射&#xff0c…

論文精讀《Frequency domain watermarking: An overview》

1. 數字水印技術基礎概念與發展背景 數字水印技術作為信息隱藏領域的核心分支,其發展歷程可以追溯到20世紀90年代中期計算機網絡和信息技術的快速發展時期。隨著大量版權作品以數字文件形式存在,電子出版逐漸普及,傳統的版權保護方法面臨前所未有的挑戰。數字水印技術應運而…

北斗短報文兜底、5G-A增強:AORO P1100三防平板構建應急通信網絡

公網中斷的災區現場&#xff0c;泥石流阻斷了最后一條光纜。一支救援隊卻在廢墟間有序穿行&#xff0c;隊長手中的三防平板正閃爍著北斗衛星信號&#xff0c;定位坐標與傷亡信息化作一行行短報文&#xff0c;穿透通信孤島直達指揮中心。這是AORO P1100三防平板搭載的北斗短報文…

Java排序算法之<冒泡排序>

目錄 1、冒泡排序介紹 2、算法步驟 3、Java 實現&#xff08;帶優化&#xff09; 4、算法復雜度分析 5、優點與缺點 前言 排序算法的“進化路線”&#xff1a; 冒泡排序 → 選擇排序 → 插入排序 → 希爾排序 → 快速排序 → 歸并排序 → 堆排序↓Java 內置排序&#xff…

生活毫無頭緒就毫無頭緒吧(7.24)

最近好長一段時間沒有記錄了明顯感覺自己陷入了混亂中作息規律&#xff0c;專注力&#xff0c;心流&#xff0c;營養的飯菜如今下筆也沒有什么頭緒&#xff0c;前些日子本有感想但是又疲于記錄&#xff0c;忘了許許多多最近在寫論文&#xff0c;但嘗試了游泳——蛙泳感覺太神奇…

vulhub-master 靶場Apache(httpd)漏洞

apache_parsing_vulnerability 漏洞原理在Apache1.x/2.x中Apache 解析?件的規則是從右到左開始判斷解析,如果后綴名為不可識別?件解析,就再往左判斷。如 1.php.xxxxx&#xff0c;Apache會試圖識別你的代碼&#xff0c;從右往左一個一個試。漏洞攻略參加一個1.php.jpg文件&…

Python 數據分析(一):NumPy 基礎知識

目錄 1. 簡介2. 使用 2.1 ndarray2.2 數據類型2.3 索引與切片2.4 副本與視圖2.5 軸的概念2.6 基本運算2.7 常用操作 1. 簡介 NumPy&#xff08;Numerical Python&#xff09;是一個開源的 Python 科學計算擴展庫&#xff0c;主要用來處理任意維度數組與矩陣&#xff0c;通常…

編程與數學 03-002 計算機網絡 04_數據鏈路層功能

編程與數學 03-002 計算機網絡 04_數據鏈路層功能一、數據鏈路層的基本任務&#xff08;一&#xff09;封裝成幀&#xff08;二&#xff09;差錯控制&#xff08;三&#xff09;流量控制二、差錯檢測與糾正方法&#xff08;一&#xff09;常用的差錯檢測碼&#xff08;二&#…

latex中既控制列內容位置又控制列寬,使用>{\centering\arraybackslash}p{0.85cm}

示例&#xff1a;\usepackage{array} % 為 >{...} 修飾符提供支持\begin{table*}[ht!]\centering \begin{tabular}{p{2.8cm} >{\centering\arraybackslash}p{0.85cm} >{\centering\arraybackslash}p{0.85cm} >{\centering\arraybackslash}p{0.85cm} >{\ce…

醫療數據挖掘Python機器學習案例

1. 醫療數據挖掘概述 醫療數據挖掘是從大量的醫療數據中提取有價值信息和知識的過程&#xff0c;旨在輔助醫療決策、疾病預測、治療方案優化等。隨著醫療信息化的發展&#xff0c;電子病歷、醫療影像、基因數據等多源異構數據不斷積累&#xff0c;為醫療數據挖掘提供了豐富的素…

人工智能概述

&#x1f31f; 歡迎來到AI奇妙世界&#xff01; &#x1f31f; 親愛的開發者朋友們&#xff0c;大家好&#xff01;&#x1f44b; 我是人工智能領域的探索者與分享者&#xff0c;很高興在CSDN與你們相遇&#xff01;&#x1f389; 在這里&#xff0c;我將持續輸出AI前沿技術、實…

C++性能優化擂臺技術文章大綱

引言性能優化在C開發中的重要性擂臺賽形式的優勢&#xff1a;激發創意&#xff0c;展示不同優化技巧目標讀者&#xff1a;中高級C開發者擂臺賽規則設計統一基準測試環境&#xff08;硬件、編譯器、優化標志&#xff09;參賽代碼需通過功能正確性驗證性能指標&#xff1a;執行時…

AI人工智能時代,Bard的智能家政服務助手

AI人工智能時代,Bard的智能家政服務助手 關鍵詞:人工智能、智能家居、Bard助手、機器學習、自然語言處理、物聯網、智能服務 摘要:本文深入探討了AI人工智能時代下,基于Bard技術的智能家政服務助手的實現原理、技術架構和應用場景。我們將從核心技術入手,分析其背后的機器…

MySQL(155)什么是MySQL的事件調度器?

MySQL的事件調度器&#xff08;Event Scheduler&#xff09;是一種強大的工具&#xff0c;用于在指定的時間間隔或特定時間點自動執行SQL語句。它類似于操作系統中的任務計劃程序或Cron作業&#xff0c;適用于需要定時執行的任務&#xff0c;如數據歸檔、定期報告生成、定時清理…

【Zephyr開發實踐系列】09_LittleFs文件系統操作

文章目錄前言編寫目的術語和縮寫詞方案選擇一、Littlefs介紹二、Littlefs搭建步驟1.設備樹構建2.自動掛載流程&#xff08;二選一&#xff09;2.1設備樹啟用自動掛載2.2 在 littlefs_fs.c 中&#xff0c;設備樹宏會被展開2.3 模塊注冊初始化2.4 初始化階段2.4.1注冊Littlefs文件…

保護板測試儀:守護電池安全的“幕后衛士”

在現代科技飛速發展的今天&#xff0c;電池作為各類電子設備和新能源系統的核心動力源&#xff0c;其安全性與穩定性直接關系到設備的正常運行和使用者的安全。而保護板作為電池的“安全衛士”&#xff0c;承擔著過充保護、過放保護、短路保護等關鍵功能。保護板測試儀則是專門…

【unitrix】 6.11 二進制數字標準化模塊(normalize.rs)

一、源碼 這個模塊實現了類型級別的二進制數標準化處理&#xff0c;確保二進制數在組合時保持最簡形式。 //! 二進制數字標準化模塊 //! //! 提供二進制數字(B<H, L>)的組合前標準化功能&#xff0c;確保數字以最簡形式表示&#xff0c; //! 避免同一數值有不同表示形式。…

解決OpenHarmony中找不到pthread_cancel和pthread_setcanceltype等libc符號的問題

筆者在移植三方庫到OpenHarmony時遇到了pthread_cancel和pthread_setcanceltype函數找不到的問題&#xff0c;將解決辦法分享如下&#xff1a; OpenHarmony的使用的c庫musl中注釋了這些函數的導出&#xff0c;在third_party/musl/libc.map.txt將屏蔽的函數中取消注釋即可

Python編程進階知識之第五課處理數據(matplotlib)

簡介matplotlib 是 Python 中最流行的數據可視化庫之一&#xff0c;它可以創建各種高質量的圖表。無論是簡單的折線圖&#xff0c;還是復雜的 3D 圖形&#xff0c;matplotlib 都能輕松應對。它提供了類似 MATLAB 的繪圖接口&#xff0c;使得用戶可以非常方便地進行圖表的創建和…