類圖+案例+代碼詳解:軟件設計模式----原型模式

5、原型模式

通過復制現有對象來創建新對象,避免從零開始構建,就像 “復印文件” 一樣。

克隆的核心是復用現有對象狀態

請添加圖片描述

用 克隆熊貓 舉例,秒懂原理

假設你有一只熊貓對象(屬性:名字、年齡、毛色),想快速創建 10 只一模一樣的熊貓:

不用原型模式: 每次 new 一個熊貓,手動設置所有屬性(名字 =“盼盼”,年齡 = 3 歲,毛色 = 黑白…),重復勞動。
用原型模式: 直接復制(克隆)已有的熊貓對象,新對象會繼承所有屬性,只需修改少數不同的地方(比如名字改成 “圓圓”)。

原型模式的核心角色(3 步走)

  1. 原型(Prototype): 定義克隆自己的接口(如clone()方法)。
  2. 具體原型(Concrete Prototype): 實現克隆邏輯,比如熊貓類。
  3. 客戶端(Client): 通過復制原型創建新對象。

為什么要用原型模式?

場景對比:
創建復雜對象時: 比如一個游戲角色有 100 個屬性,從零創建容易出錯,復制現有角色更高效。
需要多次創建相似對象時: 比如電商網站生成 100 個 “默認地址” 模板,復制比新建更快。

核心優勢

  1. 減少重復初始化: 直接復制現有對象狀態,比 new 對象后再設值更高效。
  2. 方便擴展對象類型: 新增角色時,只需復制現有原型并修改部分屬性,無需修改創建邏輯。
  3. 隔離對象創建細節: 客戶端不用知道對象如何構建,只需復制原型。

代碼示例

// 1. 原型接口:實現Cloneable接口并覆蓋clone方法  
class Panda implements Cloneable {private String name;private int age;private String color = "黑白"; // 共享屬性,所有熊貓默認毛色相同public Panda(String name, int age) {this.name = name;this.age = age;}// 克隆方法(淺拷貝)@Overrideprotected Panda clone() throws CloneNotSupportedException {return (Panda) super.clone();}//  setter/getterpublic void setName(String name) { this.name = name; }public String getName() { return name; }public void setAge(int age) { this.age = age; }public int getAge() { return age; }public String getColor() { return color; }
}// 2. 客戶端:復制原型創建新對象  
public class PrototypeDemo {public static void main(String[] args) throws CloneNotSupportedException {// 初始原型:熊貓“盼盼”Panda original = new Panda("盼盼", 3);// 克隆出熊貓“圓圓”Panda clone1 = original.clone();clone1.setName("圓圓");clone1.setAge(2);// 克隆出熊貓“團團”Panda clone2 = original.clone();clone2.setName("團團");clone2.setAge(4);// 輸出結果System.out.println("原型:" + original.getName() + ",年齡:" + original.getAge() + ",毛色:" + original.getColor());System.out.println("克隆1:" + clone1.getName() + ",年齡:" + clone1.getAge() + ",毛色:" + clone1.getColor());System.out.println("克隆2:" + clone2.getName() + ",年齡:" + clone2.getAge() + ",毛色:" + clone2.getColor());}
}

深拷貝 vs 淺拷貝

  • 淺拷貝: 只復制對象本身,不復制其引用的對象(如上面的clone()方法)。
    → 若原型中有數組或集合,克隆對象會和原型共享該數據,修改會互相影響。
  • 深拷貝: 遞歸復制所有引用的對象(需手動實現)。
    → 如序列化對象后再反序列化,確保克隆對象完全獨立。
  1. 原型模式和工廠模式的區別
    • 工廠模式:根據參數 “新建” 對象(從無到有)。
    • 原型模式:根據現有對象 “復制” 新對象(從有到有)。
  2. 實際場景舉例
    • 游戲中復制 NPC:怪物、NPC 的屬性通過復制原型快速生成。
    • Spring 框架中的Bean復制:通過BeanUtils.cloneBean()復制對象。

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

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

相關文章

Python-FAQ-__name__、__main__

1 需求 2 接口 3 示例 4 參考資料 在 Python 中,像 __name__ 這樣的雙下劃線屬性(也稱為 "dunder" 屬性,即 "double underscore" 的縮寫)是 Python 的特殊屬性或方法,它們為類、對象或模塊提供了…

Adobe高階技巧與設計師創意思維的進階指南

作為一名在全球設計圈摸爬滾打了十年的職業設計師,我深知創意與技術的結合是點燃靈感的火花。憑借英國Parvis School of Economics and Music大學提供的Adobe正版教育訂閱,我得以在設計之路上不斷探索與突破。今天,我想以輕松實用的口吻&…

音視頻會議服務搭建(設計方案-Go服務端API業務邏輯流程圖)-04

前言 這一篇是 關于 Go服務端相關的音視頻會議的接口API業務邏輯流程圖肯定是不能完全復用到你的項目中去的,但是希望對你有一些參考性的幫助嗯,我也是在不斷的進行完善和優化,并不是最終的結構,先定好大方向,然后不斷…

C++ Qt Widget繪圖畫布縮放與平移:實現CAD級交互體驗

在圖形應用程序開發中,實現流暢的縮放和平移功能是創建專業級繪圖工具的基礎。本文將深入探討如何在Qt Widget中實現CAD級別的交互體驗,包括視圖變換、坐標系統管理以及交互功能實現。核心概念:視圖變換與坐標系統 在圖形應用中,我…

Paimon 位圖索引解析:高效等值查詢的秘密( Bit-Sliced Index)

BitmapFileIndexBitmapFileIndex 這個類 是 Paimon 中一個非常重要的索引類型,它使用位圖(Bitmap)來精確定位數據,尤其擅長處理低基數(low-cardinality)列的等值查詢。BitmapFileIndex 實現了 FileIndexer …

S7-1200 CPU 與 S7-200 CPU S7通信(S7-1200 作為服務器

7-1200 CPU 與 S7-200 CPU S7通信(S7-1200 作為服務器) S7-1200 CPU 與 S7-200 CPU 之間的通信只能通過 S7 通信來實現,因為 S7-200 的以太網模塊只支持S7 通信。當S7-200作為客戶端,S7-1200作為服務器,需在客戶端單邊…

pyspark大規模數據加解密優化實踐

假如有1億行數據 方法1 spark udf解密 from pyspark.sql import SparkSession import pyspark.sql.functions as F from pyDes import * import binasciisparkSparkSession.builder.getOrCreate()def dec_fun(text):key triple_des(b"HHHHHHHHHHHHHHHHHHHHHHHH", CB…

華為云Flexus+DeepSeek征文|華為云ECS與CCE:從介紹到架構部署·僅需要此文足矣

前引:當今的企業面臨著前所未有的技術挑戰:如何構建既安全又高效、既靈活又可靠的云服務架構?如何有效整合人工智能技術,打造智能化的運維和服務體系?這些問題的答案,正在悄然改變著企業級IT基礎設施的生態…

DAY 50 預訓練模型+CBAM模塊

浙大疏錦行https://blog.csdn.net/weixin_45655710 知識點回顧: resnet結構解析CBAM放置位置的思考針對預訓練模型的訓練策略 差異化學習率三階段微調 作業: 好好理解下resnet18的模型結構嘗試對vgg16cbam進行微調策略 ResNet-18 結構核心思想 可以將R…

docker連接mysql

查看在運行的容器:docker ps -s 進入容器:docker exec -it 容器號或名 /bin/bash,如:docker exec -it c04c438ff177 /bin/bash 或docker exec -it mysql /bin/bash。 3. 登錄mysql:mysql -uroot -p123456

javaweb第182節Linux概述~ 虛擬機連接不上FinalShell

問題描述 虛擬機無法連接到finalshell 報錯 session.connect:java.net.socketexception:connection reset 或者 connection is closed by foreign host 解決 我經過一系列的排查,花費了一天的時間后,發現,只是因為,我將連接…

高壓電纜護層安全的智能防線:TLKS-PLGD 監控設備深度解析

在現代電力系統龐大復雜的網絡中,高壓電纜護層是守護電力傳輸的 "隱形鎧甲",其安全直接影響電網穩定。傳統監測手段響應慢、精度低,難以滿足安全運維需求。TLKS-PLGD 高壓電纜護層環流監控設備應運而生,提供智能化解決方…

Element-Plus Cascader 級聯選擇器獲取節點名稱和value值方法

html 部分 <template><el-cascaderref"selectAeraRef":options"areas":disabled"disabled":props"optionProps"v-model"selectedOptions"filterablechange"handleChange"><template #default"…

STM32中實現shell控制臺(命令解析實現)

文章目錄一、核心設計思想二、命令系統實現詳解&#xff08;含完整注釋&#xff09;1. 示例命令函數實現2. 初始化命令系統3. 命令注冊函數4. 命令查找函數5. 命令執行函數三、命令結構體&#xff08;cmd\_t&#xff09;四、運行效果示例五、小結在嵌入式系統的命令行控制臺&am…

基于matlab的二連桿機械臂PD控制的仿真

基于matlab的二連桿機械臂PD控制的仿真。。。 chap3_5input.m , 1206 d2plant1.m , 1364 hs_err_pid2808.log , 15398 hs_err_pid4008.log , 15494 lx_plot.m , 885 PD_Control.mdl , 35066 tiaojie.m , 737 chap2_1ctrl.asv , 988 chap2_1ctrl.m , 905

TCP、HTTP/1.1 和HTTP/2 協議

TCP、HTTP/1.1 和 HTTP/2 是互聯網通信中的核心協議&#xff0c;它們在網絡分層中處于不同層級&#xff0c;各有特點且逐步演進。以下是它們的詳細對比和關鍵特性&#xff1a;1. TCP&#xff08;傳輸控制協議&#xff09; 層級&#xff1a;傳輸層&#xff08;OSI第4層&#xff…

Java+Vue開發的進銷存ERP系統,集采購、銷售、庫存管理,助力企業數字化運營

前言&#xff1a;在當今競爭激烈的商業環境中&#xff0c;企業對于高效管理商品流通、采購、銷售、庫存以及財務結算等核心業務流程的需求日益迫切。進銷存ERP系統作為一種集成化的企業管理解決方案&#xff0c;能夠整合企業資源&#xff0c;實現信息的實時共享與協同運作&…

【趣談】Android多用戶導致的UserID、UID、shareUserId、UserHandle術語混亂討論

【趣談】Android多用戶導致的UserID、UID、shareUserId、UserHandle術語混亂討論 備注一、概述二、概念對比1.UID2.shareUserId3.UserHandle4.UserID 三、結論 備注 2025/07/02 星期三 在與Android打交道時總遇到UserID、UID、shareUserId、UserHandle這些術語&#xff0c;但是…

P1424 小魚的航程(改進版)

題目描述有一只小魚&#xff0c;它平日每天游泳 250 公里&#xff0c;周末休息&#xff08;實行雙休日)&#xff0c;假設從周 x 開始算起&#xff0c;過了 n 天以后&#xff0c;小魚一共累計游泳了多少公里呢&#xff1f;輸入格式輸入兩個正整數 x,n&#xff0c;表示從周 x 算起…

<二>Sping-AI alibaba 入門-記憶聊天及持久化

請看文檔&#xff0c;流程不再贅述&#xff1a;官網及其示例 簡易聊天 環境變量 引入Spring AI Alibaba 記憶對話還需要我們有數據庫進行存儲&#xff0c;mysql&#xff1a;mysql-connector-java <?xml version"1.0" encoding"UTF-8"?> <pr…