原型模式及其應用

引言

原型模式(Prototype Pattern)是一種創建型設計模式,它允許通過復制現有對象來創建新對象,而無需通過構造函數來創建。這種模式通過克隆現有對象來創建新對象,從而避免了復雜的初始化過程。本文將探討原型模式的好處,并介紹一些經典框架中的應用案例。

原型模式的定義

原型模式的核心思想是通過復制現有對象來創建新對象。這種方式可以簡化對象的創建過程,特別是在對象的創建過程比較復雜時。原型模式通常涉及以下幾個角色:

  • Prototype(原型):聲明一個克隆自身的接口。
  • ConcretePrototype(具體原型):實現克隆自身的接口,返回一個克隆的對象。
  • Client(客戶端):使用原型來創建新的對象。
原型模式的好處
  1. 性能提升

    • 克隆現有對象通常比通過構造函數創建新對象更快,尤其是在對象初始化過程復雜時。
    • 克隆操作可以避免重復的初始化邏輯,提高程序的性能。
  2. 簡化對象創建

    • 通過克隆現有對象,可以避免復雜的初始化過程,簡化對象的創建。
    • 特別適用于對象的創建過程涉及大量參數或配置的情況。
  3. 減少依賴

    • 克隆現有對象可以減少對構造函數的依賴,使得代碼更加靈活和可維護。
    • 適用于需要動態創建對象的場景,例如配置管理、對象池等。
  4. 支持多態性

    • 通過接口或抽象類定義克隆方法,可以支持多態性,使得不同類型的對象可以使用相同的克隆方法。
經典框架應用案例
  1. Spring框架

    • Bean的原型作用域:Spring框架中的Bean可以配置為原型作用域(prototype scope)。每次請求原型作用域的Bean時,Spring會創建一個新的實例。這種方式利用了原型模式的思想,通過克隆現有對象來創建新對象。
    • 示例
      <bean id="exampleBean" class="com.example.ExampleBean" scope="prototype"/>
      
  2. Apache Commons Lang

    • ObjectUtils.clone:Apache Commons Lang庫提供了一個 ObjectUtils.clone 方法,用于克隆對象。這個方法利用了原型模式的思想,通過調用對象的 clone 方法來創建新對象。
    • 示例
      ExampleBean original = new ExampleBean();
      ExampleBean cloned = ObjectUtils.clone(original);
      
  3. Java標準庫

    • Cloneable接口:Java標準庫中的 Cloneable 接口是一個標記接口,表示該類支持克隆操作。通過實現 Cloneable 接口并重寫 clone 方法,可以實現對象的克隆。
    • 示例
      public class ExampleBean implements Cloneable {private String name;public ExampleBean(String name) {this.name = name;}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}public static void main(String[] args) {try {ExampleBean original = new ExampleBean("Original");ExampleBean cloned = (ExampleBean) original.clone();System.out.println(cloned.name); // 輸出: Original} catch (CloneNotSupportedException e) {e.printStackTrace();}}
      }
      
  4. 對象池

    • 對象池模式:對象池模式是一種常用的優化技術,通過復用對象來減少創建和銷毀對象的開銷。對象池通常使用原型模式來創建新對象,通過克隆現有對象來快速生成新對象。
    • 示例
      public class ObjectPool {private List<ExampleBean> pool = new ArrayList<>();public ObjectPool(int size) {for (int i = 0; i < size; i++) {pool.add(new ExampleBean("Object " + i));}}public ExampleBean getObject() {if (pool.isEmpty()) {return new ExampleBean("New Object");} else {return pool.remove(0);}}public void returnObject(ExampleBean obj) {pool.add(obj);}
      }
      
總結

原型模式通過克隆現有對象來創建新對象,具有性能提升、簡化對象創建、減少依賴和支持多態性等優點。在實際開發中,原型模式被廣泛應用于各種框架和庫中,如Spring框架的原型作用域、Apache Commons Lang的 ObjectUtils.clone 方法、Java標準庫的 Cloneable 接口以及對象池模式等。通過合理使用原型模式,可以提高程序的性能和可維護性,簡化復雜的對象創建過程。

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

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

相關文章

thinkphp漏洞再現

Thinkphp5x遠程命令執行及getshell 1、開環境 2、使用工具攻擊 開啟工具 輸入地址&#xff0c;點擊漏洞檢測 存在漏洞之后&#xff0c;選擇漏洞&#xff0c;執行命令 3、也可以執行遠程命令 執行命令 ?sindex/think\app/invokefunction&functioncall_user_func_array&…

Day16 -實例:Web利用郵箱被動繞過CDN拿真實ip

本想測試一下全局ping&#xff0c;剛好注冊的時候收到了郵件&#xff0c;剛好去做一下復現。 原理&#xff1a;主動讓對方站點給我們發郵件&#xff08;注冊、修改密碼、訂閱推送等&#xff09;我們查看郵件原文&#xff0c;原文里存在真實的郵件站點ip 特點&#xff1a;郵件…

vue3 數據監聽(watch、watchEffect)

1、watch 1.1基本使用 作用&#xff1a;數據監聽 語法&#xff1a; watch(監聽的數據, (改變后的數據, 改變前的數據) > { console.log(newVal, oldVal); }) 注意點&#xff1a;watch寫法上支持一個或者多個監聽源&#xff0c;這些監聽源必須只能是getter/effect函數…

網盤解析工具更新,解決了一些bug

解析工具v1.2.1版本更新&#xff0c;本次是小版本更新&#xff0c;修復了一些bug。 之前小伙伴反應的網盤進入文件后不能返回上一級&#xff0c;現在這個bug修復了&#xff0c;已經可以點擊了。 點擊資源后會回到資源那一級目錄&#xff0c;操作上是方便了不少。 增加了檢查自…

推薦1款簡潔、小巧的實用收音機軟件,支持手機和電腦

聊一聊 沒想到現在還有人喜歡聽廣播。 我一直以為聽廣播必須要用那種小廣播機才可以。 原來手機或電腦上也是可以的。 今天給大家分享一款可以在電腦和手機上聽廣播的軟件。 軟件介紹 龍卷風收音機 電臺廣播收音機分電腦和手機兩個版本。 電腦端無需安裝&#xff0c;下載…

六十天前端強化訓練之第三十一天之Webpack 基礎配置 大師級講解(接下來幾天給大家講講工具鏈與工程化)

歡迎來到編程星辰海的博客講解 看完可以給一個免費的三連嗎&#xff0c;謝謝大佬&#xff01; 目錄 一、Webpack 核心概念解析 二、實戰&#xff1a;多資源打包配置&#xff08;含完整代碼&#xff09; 三、配置深度解析&#xff08;重點部分說明&#xff09; 四、效果演示…

機器學習——Bagging、隨機森林

相比于Boosting的集成學習框架&#xff0c;Bagging(Bootstrap Sampling&#xff0c;自助聚集法&#xff0c;又稱為自助采樣)作為一種自助聚集且并行化的集成學習方法&#xff0c;其通過組合多個基學習器的預測結果來提高模型的穩定性和泛化能力。其中隨機森林是Bagging學習框架…

【藍橋杯】每日練習 Day13

前言 今天做了不少題&#xff0c;但是感覺都太水了&#xff0c;深思熟慮之下主播決定拿出兩道相對不那么水的題來說一下&#xff08;其實還是很水&#xff09;。 兩道問題&#xff0c;一道是日期問題&#xff08;模擬&#xff09;&#xff0c;一道是區間合并問題。 日期差值 …

HTML輸出流

HTML 輸出流 JavaScript 中**「直接寫入 HTML 輸出流」**的核心是通過 document.write() 方法向瀏覽器渲染過程中的數據流動態插入內容。以下是詳細解釋&#xff1a; 一、HTML 輸出流的概念 1. 動態渲染過程 HTML 文檔的加載是自上而下逐行解析的。當瀏覽器遇到 <script&…

理解文字識別:一文讀懂OCR商業化產品的算法邏輯

文字識別是一項“歷久彌新”的技術。早在上世紀初&#xff0c;工程師們就開始嘗試使用當時有限的硬件設備掃描并識別微縮膠片、紙張上的字符。隨著時代和技術的發展&#xff0c;人們在日常生活中使用的電子設備不斷更新換代&#xff0c;文字識別的需求成為一項必備的技術基礎&a…

開源模型應用落地-語音轉文本-whisper模型-AIGC應用探索(五)

一、前言 在上一節中&#xff0c;學習了如何使用vLLM來部署Whisper-large-v3-turbo模型。不過&#xff0c;在實際使用時&#xff0c;模型一次只能處理30秒的音頻。今天&#xff0c;將結合實際業務&#xff0c;介紹如何處理一段完整的音頻&#xff0c;并生成相應的字幕文件。 相…

“十五五”時期航空彈藥發展環境分析

1&#xff0e;“十五五”時期航空彈藥發展環境分析 &#xff08;標題&#xff1a;小二號宋體居中&#xff09; 一、建言背景介紹 &#xff08;一級標題&#xff1a;黑體三號&#xff0c;首行空兩格&#xff09; 航空彈藥作為現代戰爭的核心裝備&#xff0c;其發展水平直接關乎…

IDEA批量替換項目下所有文件中的特定內容

文章目錄 1. 問題引入2. 批量替換項目下所有文件中的特定內容2.1 右鍵項目的根目錄&#xff0c;點擊在文件中替換2.2 輸入要替換的內容 3. 解決替換一整行文本后出現空行的問題4. 增加篩選條件提高匹配的精確度 更多 IDEA 的使用技巧可以查看 IDEA 專欄&#xff1a; IDEA 1. 問…

藍橋杯 臨時抱佛腳 之 二分答案法與相關題目

二分答案法&#xff08;利用二分法查找區間的左右端點&#xff09; &#xff08;1&#xff09;估計 最終答案可能得范圍 是什么 &#xff08;2&#xff09;分析 問題的答案 和 給定條件 之間的單調性&#xff0c;大部分時候只需要用到 自然智慧 &#xff08;3&#xff09;建…

學習爬蟲的第二天——分頁爬取并存入表中

閱讀提示&#xff1a;我現在還在嘗試爬靜態頁面 一、分頁爬取模式 以豆瓣Top250為例&#xff1a; 基礎url:豆瓣電影 Top 250https://movie.douban.com/top250 分頁參數:?start0&#xff08;第一頁&#xff09;、?start25&#xff08;第二頁&#xff09;等 每頁顯示25條數…

第 8 章:使用更好的庫_《C++性能優化指南》_notes

使用更好的庫 第八章核心知識點解析編譯與測試建議總結優化原則重點內容&#xff1a;第一部分&#xff1a;多選題&#xff08;10題&#xff09;第二部分&#xff1a;設計題答案與解析多選題答案&#xff1a;設計題答案示例&#xff08;部分&#xff09;&#xff1a; 測試用例設…

RabbitMQ 學習整理1 - 基礎使用

項目代碼&#xff1a;RabbitMQDemo: 學習RabbitMQ的一些整理 基本概念 RabbitMQ是一種基于AMQP協議的消息隊列實現框架RabbitMQ可以用于在系統與系統之間或者微服務節點之間&#xff0c;進行消息緩存&#xff0c;消息廣播&#xff0c;消息分配以及限流消峰處理RabbitMQ-Serve…

React組件簡介

組件 在 React 中&#xff0c;組件&#xff08;Component&#xff09; 是 UI 的基本構建塊。可以把它理解為一個獨立的、可復用的 UI 單元&#xff0c;類似于函數&#xff0c;它接受輸入&#xff08;props&#xff09;&#xff0c;然后返回 React 元素來描述 UI。 組件的簡單…

Kafka消息序列化深度革命:構建高性能、高安全的自定義編碼體系

一、突破默認序列化的桎梏 1.1 原生序列化器的致命缺陷 Kafka默認提供的StringSerializer/ByteArraySerializer在復雜場景下暴露三大痛點&#xff1a; 類型安全黑洞&#xff1a;字節流缺乏元數據描述&#xff0c;消費端解析如履薄冰版本兼容困境&#xff1a;數據結構變更導致…

向量數據庫與傳統數據庫的差異

向量數據庫是一種專門設計用于高效存儲、管理和檢索**向量數據&#xff08;高維數值數組&#xff09;**的數據庫系統。它針對非結構化數據&#xff08;如圖像、文本、音頻&#xff09;的特征進行優化&#xff0c;通過將數據轉化為向量嵌入&#xff08;embeddings&#xff09;&a…