Java編程之原型模式

原型模式的定義

原型模式(Prototype Pattern)是一種創建型設計模式,通過復制已有對象來創建新對象,而非通過常規的手段的new關鍵字來實例化。適用于對象創建成本較高或需要動態配置的場景。
例如,在一個游戲開發中,可能需要創建大量具有相似屬性的游戲角色。如果每個角色都通過構造函數來創建,并且初始化過程涉及到加載大量資源(如紋理、模型等),那么創建這些角色將消耗大量的時間和資源。使用原型模式,我們可以先創建一個原型角色對象,然后通過克隆這個原型來快速生成多個相似的角色對象,大大提高了創建效率。?
在 Java 中,原型模式的實現主要依賴于Cloneable接口和Object類中的clone()方法。當一個類實現了Cloneable接口,就表明該類的對象可以被克隆。Object類中的clone()方法是一個本地方法,它負責創建并返回當前對象的一個副本。但需要注意的是,默認的clone()方法執行的是淺克隆(Shallow Copy),這在某些情況下可能無法滿足我們的需求。

原型模式的核心角色

  1. Prototype(抽象原型):聲明克隆方法的接口,通常包含一個clone()方法,用于創建并返回對象的副本(通常為Cloneable接口)。
  2. ConcretePrototype(具體原型):實現克隆方法的具體類。 實現了抽象原型類中聲明的克隆方法,在克隆方法中返回自己的一個克隆對象。
  3. 客戶類(Client):使用原型對象來創建新對象的類。客戶類通過調用原型對象的clone()方法來獲取新的對象實例,而無需關心對象的具體創建過程。

實現方式

Java中通過Cloneable接口和Object.clone()實現原型模式。
下面通過一個簡單的 Java 代碼示例來展示原型模式的結構:?

// 抽象原型類
interface Prototype {Prototype clone();
}// 具體原型類
class ConcretePrototype implements Prototype {private String data;public ConcretePrototype(String data) {this.data = data;}public String getData() {return data;}@Overridepublic Prototype clone() {// 這里簡單返回一個新的實例,實際應用中可能需要更復雜的克隆邏輯return new ConcretePrototype(data);}
}// 客戶類
public class Client {public static void main(String[] args) {ConcretePrototype prototype = new ConcretePrototype("初始數據");Prototype clonedPrototype = prototype.clone();System.out.println("原對象數據: " + prototype.getData());System.out.println("克隆對象數據: " + clonedPrototype.getData());}
}

需注意淺拷貝與深拷貝的區別。

淺拷貝示例

僅復制對象本身,不復制引用字段指向的對象。

class ShallowPrototype implements Cloneable {private String name;private List<String> list;public ShallowPrototype(String name, List<String> list) {this.name = name;this.list = list;}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone(); // 淺拷貝}
}
深拷貝示例

復制對象及其引用字段指向的所有對象。

class DeepPrototype implements Cloneable {private String name;private List<String> list;public DeepPrototype(String name, List<String> list) {this.name = name;this.list = list;}@Overrideprotected Object clone() throws CloneNotSupportedException {DeepPrototype copy = (DeepPrototype) super.clone();copy.list = new ArrayList<>(this.list); // 深拷貝引用字段return copy;}
}

原型模式的優缺點

優點

  • 避免重復初始化對象,提升性能。
  • 動態配置新對象,無需依賴子類構造。

缺點

  • 深拷貝實現復雜,需遞歸處理引用對象。
  • 破壞封裝性,需謹慎處理clone()方法。

應用場景

  1. 對象創建耗時(如數據庫查詢結果緩存)。
  2. 需要動態配置對象屬性(如游戲中人物的克隆)。
  3. 結合工廠模式使用,統一對象創建邏輯。

注意事項

  • 確保clone()方法正確處理可變引用字段。
  • 若類包含非Cloneable的引用對象,需自定義深拷貝邏輯。
  • 考慮使用序列化/反序列化實現深拷貝(如Apache CommonsSerializationUtils)。

通過合理使用原型模式,可以顯著優化對象創建效率,尤其適合復雜對象的復制場景。

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

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

相關文章

RAG質量評估

當完成了一個RAG系統的開發工作以后&#xff0c;還需要對該系統的性能進行評估。如何對RAG系統的性能進行評估呢&#xff1f;仔細分析RAG系統的產出成果&#xff0c;主要涉及以下幾點&#xff1a; &#xff08;1&#xff09;檢索器組件 檢索的相關文檔 context, &#xff08;…

LLMs基礎學習(八)強化學習專題(1)

LLMs基礎學習&#xff08;八&#xff09;強化學習專題&#xff08;1&#xff09; 文章目錄 LLMs基礎學習&#xff08;八&#xff09;強化學習專題&#xff08;1&#xff09;學習資料資源強化學習是什么強化學習一句話精準定義 強化學習與其他學習類型的對比強化學習 vs 監督學習…

19-Oracle 23 ai Database Sharding-知識準備

小伙伴是不是經常遇見大規模集群和數量的時候&#xff0c;業務就提出要對數據進行sharding。 Oracle 和其他數據庫&#xff08;如 MySQL、PostgreSQL、MongoDB 等&#xff09; 為什么要進行分片&#xff08;sharding&#xff09;&#xff0c;分片的原因是什么&#xff0c;實現…

分類與邏輯回歸 - 一個完整的guide

線性回歸和邏輯回歸其實比你想象的更相似 &#x1f603; 它們都是所謂的參數模型。讓我們先看看什么是參數模型&#xff0c;以及它們與非參數模型的區別。 線性回歸 vs 邏輯回歸 線性回歸&#xff1a;用于回歸問題的線性參數模型。邏輯回歸&#xff1a;用于分類問題的線性參數…

英語寫作中“每一個”each individual、every individual、every single的用法

一、Individual &#xff1a;個體&#xff0c;相對于團體&#xff0c;例如&#xff1a; Individual competition &#xff08;個人比賽&#xff09;&#xff0c;相對于team competition &#xff08;團體比賽&#xff09; Individual users &#xff08;個人用戶&#xff09;…

由于 z(x,y) 的變化導致的影響(那部分被分給了鏈式項)

? 本質問題&#xff1a;為什么鏈式法則中 ? F ? x \frac{\partial F}{\partial x} ?x?F? 不考慮 z z ( x , y ) zz(x,y) zz(x,y)&#xff1f; &#x1f50d; 一、關鍵是&#xff1a;偏導數的定義是什么&#xff1f; 我們從最根本的定義開始&#xff1a; ? F ( x , y…

python打卡day44@浙大疏錦行

知識點回顧&#xff1a; 預訓練的概念常見的分類預訓練模型圖像預訓練模型的發展史預訓練的策略預訓練代碼實戰&#xff1a;resnet18 作業&#xff1a; 嘗試在cifar10對比如下其他的預訓練模型&#xff0c;觀察差異&#xff0c;盡可能和他人選擇的不同嘗試通過ctrl進入resnet的…

十一(3) 類,加深對拷貝構造函數的理解

class ClassName { public: // 拷貝構造函數&#xff1a;參數是同類型對象的引用&#xff08;通常為 const 引用&#xff09; ClassName(const ClassName& other) { // 復制 other 的成員變量到當前對象 } }; 參數要求&#xff1a;必須是同類型對象的引用&#xff0…

網頁后端開發(基礎1--maven)

maven的作用&#xff1a; Maven是一款管理和構建Java項目的工具。 1.依賴管理&#xff1a; 方便快捷的管理項目依賴的資源&#xff08;jar包&#xff09; 不用手動下載jar包&#xff0c;只需要中maven中引用&#xff0c;maven會查找本地倉庫。若本地倉庫沒有&#xff0c;會直…

認識電子元器件---高低邊驅動

目錄 一、基本概念 二、關鍵參數對比 三、工作原理 &#xff08;1&#xff09;高邊驅動 &#xff08;2&#xff09;低邊驅動 四、典型的應用場景 五、如何選擇 一、基本概念 可以理解成&#xff1a;高低邊驅動是MOS/IGBT的一種應用方式 高低邊驅動是電路拓撲概念&#…

JavaScript 標簽加載

目錄 JavaScript 標簽加載script 標簽的 async 和 defer 屬性&#xff0c;分別代表什么&#xff0c;有什么區別1. 普通 script 標簽2. async 屬性3. defer 屬性4. type"module"5. 各種加載方式的對比6. 使用建議 JavaScript 標簽加載 script 標簽的 async 和 defer …

C/CPP 結構體、聯合體、位段內存計算 指南

C/CPP 結構體、聯合體、位段內存計算 指南 在C語言中&#xff0c;結構體、聯合體和位段是對數據的高級抽象&#xff0c;它們可以讓程序員以更易于理解的方式來操作復雜的數據結構。然而&#xff0c;這些結構在內存中的布局可能并不如它們的語法結構那樣直觀&#xff0c;特別是當…

ASR(語音識別)語音/字幕標注 通過via(via_subtitle_annotator)

文章目錄 1 VIA 官網資料2 語音/字幕標注3 鍵盤快捷鍵常規當一個時間片段被選中時圖像或視頻幀中的空間區域 1 VIA 官網資料 VIA官網&#xff1a;https://www.robots.ox.ac.uk/~vgg/software/via/ VIA官網標注示例&#xff1a;https://www.robots.ox.ac.uk/~vgg/software/via/…

mq安裝新版-3.13.7的安裝

一、下載包&#xff0c;上傳到服務器 https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.13.7/rabbitmq-server-generic-unix-3.13.7.tar.xz 二、 erlang直接安裝 rpm -ivh erlang-26.2.4-1.el8.x86_64.rpm不需要配置環境變量&#xff0c;直接就安裝了。 erl…

高通平臺PCIE EP模式log丟失問題

高通平臺PCIE EP模式log丟失問題 1 問題背景2 問題分析2.1 對比USB2.1.1 Logtool優化2.1.2 Device mhi與fs對比2.2 優化方案2.2.1 Diag系統優化2.2.2 Host mhi優化3 最終成果1 問題背景 高通5G模組如SDX55\SDX62\SDX65\SDX72\SDX75等支持pcie ep模式。會通過pcie與host(如MT7…

Python應用輸入輸出函數

大家好!在 Python 編程中&#xff0c;輸入輸出函數是與用戶進行交互的橋梁。通過輸入函數&#xff0c;我們可以獲取用戶的輸入數據&#xff1b;通過輸出函數&#xff0c;我們可以向用戶展示程序的運行結果。對于初學者來說&#xff0c;掌握基本的輸入輸出操作是編程入門的重要一…

如何使用 Ansible 在 Ubuntu 24.04 上安裝和設置 LNMP

在當今世界,自動化是有效管理和部署 Web 應用程序的關鍵。Ansible 是一個強大的自動化工具,它是一款開源軟件配置、配置管理和應用程序部署工具。本文將指導您使用 Ansible 在 Ubuntu 服務器上安裝 LNMP 堆棧(Linux、Nginx、MySQL、PHP)。 先決條件 為了執行本指南中討論的…

Xela矩陣三軸觸覺傳感器的工作原理解析與應用場景

Xela矩陣三軸觸覺傳感器通過先進技術模擬人類觸覺感知&#xff0c;幫助設備實現精確的力測量與位移監測。其核心功能基于磁性三維力測量與空間位移測量&#xff0c;能夠捕捉多維觸覺信息。該傳感器的設計不僅提升了觸覺感知的精度&#xff0c;還為機器人、醫療設備和制造業的智…

RK3288項目(四)--linux內核之V4L2框架及ov9281驅動分析(中)

目錄 一、引言 二、V4L2其他部件驅動分析 ------>2.1、mipi-dphy ------------>2.1.1、dts ------------>2.1.2、driver ------------>2.1.3、notifier機制 ------------>2.1.4、異步回調 ------------>2.1.5、V4L2 subdev ------>2.2、mipi-csi…

容器-使用slim減少10x+大模型鏡像

slim&#xff08;原docker-slim&#xff09;是一個開源工具&#xff0c;全稱SlimToolkit&#xff08;https://github.com/slimtoolkit/slim&#xff09;&#xff0c;用于基于已有的Docker鏡像減小鏡像的大小&#xff0c;同時盡可能保留容器的功能。它通過分析鏡像的運行環境和應…