23種設計模式-原型(Prototype)設計模式

原型設計模式

  • 🚩什么是原型設計模式?
  • 🚩原型設計模式的特點
  • 🚩原型設計模式的結構
  • 🚩原型設計模式的優缺點
  • 🚩原型設計模式的Java實現
  • 🚩代碼總結
  • 🚩總結

🚩什么是原型設計模式?

原型模式(Prototype Pattern)創建型設計模式,它用于 克隆對象,而不是重新創建它們

原型模式 中,我們創建一個對象作為原型,并允許其克隆多個副本,而不必重新初始化所有字段。

使用場景

  • 創建對象開銷較大,但又需要 多個相似對象
  • 對象的構造過程復雜,希望通過 復制現有對象 來減少重復代碼。
  • 需要 避免使用 new 關鍵字 來創建實例。

🚩原型設計模式的特點

  • 減少對象創建成本:克隆對象比 new 關鍵字創建對象更高效。
  • 避免重復初始化:對象已存在,直接克隆,不需要重復賦值。
  • 提供深拷貝和淺拷貝:可以根據需求實現不同級別的克隆。
  • 解耦對象構造:創建對象的邏輯獨立于使用對象的邏輯。

🚩原型設計模式的結構

原型模式包含以下幾個主要部分:

  • Prototype(原型接口):定義 clone() 方法,所有要克隆的類都要實現該接口。
  • ConcretePrototype(具體原型類):實現 Prototype 接口,并提供克隆對象的方法。
  • Client(客戶端):通過調用 clone() 方法來創建新對象,而不是使用 new

圖例:

在這里插入圖片描述

🚩原型設計模式的優缺點

? 優點

  • 提高性能:避免了 new 操作,減少對象創建開銷。
  • 簡化對象創建:只需要 clone() 方法即可獲得新對象。
  • 減少代碼重復:省去了重新初始化對象的代碼邏輯。

? 缺點

  • 需要實現 clone() 方法:所有類都要 顯式實現克隆邏輯,可能增加代碼復雜度。
  • 深拷貝和淺拷貝問題
    • 淺拷貝:僅復制對象本身,不復制其內部引用對象。
    • 深拷貝:需要手動實現內部對象的克隆邏輯,可能增加代碼復雜度。

🚩原型設計模式的Java實現

代碼地址:GitHub

  • 首先創建一個原型接口Prototype,接口定義一個clone()方法
/*** @author hanson* @description: 原型接口* @date 2025-03-23 22:30:55* @version: 1.0*/
public interface Prototype {public Object Clone();
}
  • 現在創建一個具體的產品Product去實現這個接口,重寫clone方法
/*** @author hanson* @description: 體原型類* @date 2025-03-23 22:31:37* @version: 1.0*/
public class Product implements Prototype {private int id;private double price;public Product() {}public Product(int id, double price) {this.id = id;this.price = price;}public int getId() {return id;}public double getPrice() {return price;}@Overridepublic Object Clone() {Product object = new Product();object.id = this.id;object.price = this.price;return object;}
}
  • 創建一個客戶端調用測試
/*** @author hanson* @description: 模擬客戶端* @date 2025-03-23 22:33:22* @version: 1.0*/
public class PrototypePattern {public static void main(String[] args) {Product product1 = new Product(2022, 5.28);System.out.println(product1.getId() + " " + product1.getPrice());// Product product2 = new Product(2022, 5.28);Product product2 = (Product) product1.Clone();System.out.println(product2.getId() + " " + product2.getPrice());Product product3 = (Product) product1.Clone();System.out.println(product3.getId() + " " + product3.getPrice());}
}

📌 運行結果

在這里插入圖片描述

🚩代碼總結

  • Prototype(原型接口) 定義 Clone() 方法,所有要克隆的類都要實現該接口。
  • Product(具體原型類) 實現 Prototype 接口,并在 Clone() 方法中復制對象屬性。
  • Main(客戶端) 通過 Clone() 方法克隆多個 Product 實例,而不是使用 new 關鍵字創建對象。

🚩總結

  • 原型模式(Prototype Pattern) 適用于 創建成本高構造邏輯復雜 的對象。
  • 通過 clone() 方法復制對象,避免 new 關鍵字的高成本操作。
  • 在 Java 中,可以使用 Cloneable 接口和 Object.clone() 方法 簡化克隆操作
  • 在實現深拷貝時,需要 手動克隆內部對象,以避免淺拷貝帶來的問題。

? 適用場景:

  • 需要 高效創建對象,避免 new 關鍵字帶來的性能損耗。
  • 需要 重復創建相同類型的對象,但不希望每次都手動初始化。
  • 適用于 具有復雜狀態的對象,希望通過復制來保留狀態。

創作不易,不妨點贊、收藏、關注支持一下,各位的支持就是我創作的最大動力??

在這里插入圖片描述

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

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

相關文章

Oracle-rman restore遭遇RMAN-03002與ORA-19563

文章目錄 在原DB上檢查是否有重復的文件名:查看rman恢復的日志修正重名部分重新執行rman恢復結論: 在 RMAN 恢復過程中,遇到RMAN-03002連同ORA-19563:錯誤。 操作是將 Oracle 10.0.5的數據庫備份從 RMAN備份恢復到另一臺測試主機的同一個目錄…

運維網絡排查工具介紹與使用

作為一名運維工程師,日常工作中最令人頭疼的莫過于各種網絡故障。在過去一年半的運維生涯中,我積累了豐富的網絡故障排查經驗,今天就來和大家分享一下如何運用抓包工具(Wireshark、tcpdump)和網絡排查工具(…

解決vscode終端和本地終端python版本不一致的問題

🌿 問題描述 本地終端: vscode終端: 別被這個給騙了,繼續往下看: 難怪我導入一些包的時候老提示找不到,在本地終端就不會這樣,于是我嚴重懷疑vscode中的python版本和終端不一樣&#xff0c…

Sublime全局搜索快捷鍵Ctrl+Shift+F不能使用解決

問題描述: 在安裝好Sublime后,我們使用快捷鍵進行全局搜索,發現沒有反應,但是中文輸入變成了繁體。 解決方案: 如截圖,在關閉簡繁切換的快捷鍵或者換成其他的就行

海康HTTP監聽報警事件數據

http監聽接收報警事件數據 海康獲取設備報警事件數據兩種方式: 1、sdk 布防監聽報警事件數據,服務端布防。(前面文章有示例) 2、http監聽接收報警事件數據,設備直接推送。 http監聽接收報警事件數據,服務端可以使用n…

Python----計算機視覺處理(Opencv:圖像邊緣檢測:非極大值抑制,雙閾值篩選)

一、 高斯濾波 邊緣檢測本身屬于銳化操作,對噪點比較敏感,所以需要進行平滑處理。這里使用的是一個5*5的高斯 核對圖像進行消除噪聲。 二、計算圖像的梯度和方向 三、非極大值抑制 在得到每個邊緣的方向之后,其實把它們連起來邊緣檢測就算完了…

Maven工具學習使用(四)——倉庫

倉庫分類 對于Mavne來說,倉庫只分為兩類:本地倉庫和遠程倉庫。當Maven根據坐標查詢尋找構件的時候,它首先會查看本地倉庫,如果本地倉庫存在此構件,則直接使用;如果本地倉庫不存在此構件,或者需要查看是否有更新的構件版本,Maven就會去遠程倉庫查找,發現需要的構件之后…

Axure PR 9.0(發音:Ack-sure)原型圖工具入門教程:鏈接交互

文章目錄 引言Axure? RP 9I Axure RP9入門介紹元件庫對兩個元件進行連接頁面:導航視圖、概要母版交互II 鏈接交互從A頁面跳轉到B頁面返回之前的頁面see also引言 【 產品原型圖】核心價值和實際應用場景:可視化需求,統一團隊理解 https://blog.csdn.net/z929118967/articl…

docker遠程debug

1. 修改 Java 啟動命令 在 Docker 容器中啟動 Java 程序時,需要添加 JVM 調試參數,jdk8以上版本 java -agentlib:jdwptransportdt_socket,servery,suspendn,address*:5005 -jar your-app.jar jdk8及以下版本: java -Xdebug -Xrunjdwp:tra…

K8S學習之基礎五十四:jenkins新建測試流水線

jenkins新建測試流水線 新建任務 node(testak) {stage(第1步:從gitee上下載源代碼) {git url: "https://gitee.com/akang007/jenkins-sample"script {build_tag sh(returnStdout: true, script: git rev-parse --short HEAD).trim()}}stage(第2步:基…

SylixOS 中 select 原理及使用分析

1、select接口簡介 1.1 select接口使用用例 select 是操作系統多路 I/O 復用技術實現的方式之一。 select 函數允許程序監視多個文件描述符,等待所監視的一個或者多個文件描述符變為“準備好”的狀態。所謂的”準備好“狀態是指:文件描述符不再是阻塞狀…

Spring WebFlux之ServerWebExchange

ServerWebExchange 是 Spring WebFlux 中的一個核心接口,用于表示服務器端處理的 HTTP 請求和響應。它封裝了請求和響應的所有信息,并提供了相應的方法來操作這些信息。ServerWebExchange 在響應式編程模型中扮演著關鍵角色,支持非阻塞、異步…

Flutter 常見錯誤和坑

1. 狀態管理問題 StatefulWidget 生命周期誤用 // 錯誤:在 build 方法中修改狀態 override Widget build(BuildContext context) {setState(() { counter; }); // 會導致無限重建循環return Text($counter); }// 正確:在事件處理中修改狀態 Widget bui…

C++智能指針萬字詳細講解(包含智能指針的模擬實現)

在筆試,面試中智能指針經常出現,如果你對智能指針的作用,原理,用法不了解,那么可以看看這篇博客講解,此外本博客還簡單模擬實現了各種指針,在本篇的最后還應對面試題對智能指針的知識點進行了拓…

【Go】Go語言結構體筆記

整體介紹 雖然 Go 語言不是傳統意義上的面向對象語言,但它提供了結構體(struct)來組織數據,并且可以為結構體綁定方法,從而達到面向對象的部分效果。 關鍵知識點包括: 結構體定義與實例化 定義結構體時使用…

Three.js 快速入門教程【十八】射線拾取模型——鼠標點擊屏幕選中模型或物體

系列文章目錄 Three.js 快速入門教程【一】開啟你的 3D Web 開發之旅 Three.js 快速入門教程【二】透視投影相機 Three.js 快速入門教程【三】渲染器 Three.js 快速入門教程【四】三維坐標系 Three.js 快速入門教程【五】動畫渲染循環 Three.js 快速入門教程【六】相機控件 Or…

Object.defineProperty()Proxy詳解(Vue23數據劫持實現)

底層原理👇🏿 總結一下,結構應該包括: 1. 方法的基本作用和參數。 2. 數據描述符和存取描述符的區別。 3. 屬性定義的內部處理流程。 4. 在Vue中的應用實例。 5. 常見錯誤和正確實踐。 每個部分都要結合搜索結果的信息&…

MySQL 進階語法:函數、約束、多表查詢、事務

目錄 一、MySQL 常用函數 1. 字符串函數 1.1 基本字符串操作 1.2 字符串截取與處理 1.3 字符串搜索與替換 2. 數值函數 2.1 基本數學運算 2.2 數學計算 2.3 隨機數與符號 3. 日期時間函數 3.1 獲取當前時間 3.2 日期時間計算 3.3 日期時間提取 3.4 日期時間格式化…

第 12 章(番外)| Solidity 安全前沿趨勢 × 審計生態 × 職業路徑規劃

🌐 第 12 章(番外)| Solidity 安全前沿趨勢 審計生態 職業路徑規劃 ——做得了審計,也接得了項目,走進 Web3 安全工程師的職業實戰地圖 ? 本章導讀 Solidity 安全,不只是代碼安全、業務安全、審計安全…

1、pytest基本用法

目錄 先給大家分享下學習資源 1. 安裝pytest 2. 編寫用例規則 3. 執行用例 最近在學習pytest的用法 并且用這套框架替換了原來的unittest, 同是測試框架 確實感覺到pytest更加便捷 這邊分享給大家我得學習心得 先給大家分享下學習資源 1 官方文檔 pytest 官方…