原型模式Prototype Pattern

模式定義

用原型實例指定創建對象的種類,并且通過復制這些原型創建新的對象,其允許一個對象再創建
另外一個可定制的對象,無須知道任何創建的細節

  • 對象創建型模式

基本工作原理是通過將一個原型對象傳給那個要發動創建的對象,這個要發動創建的對象通過請求原型對象拷貝原型自己來實現創建過程

模式結構

  • Prototype:抽象原型類
    • 在Java中可以直接使用Object,其提供clone()方法實現對象的克隆
      • 一般而言,clone()方法滿足:
        • 對任何的對象x,都有x.clone() !=x,即克隆對象與原對象不是同一個對象
        • 對任何的對象x,都有x.clone().getClass() == x.getClass(),即克隆對象與原對象的類型一樣
        • 如果對象x的equals()方法定義恰當,那么有x.clone().equals(x) == true
  • ConcretePrototype:具體原型類
    • 能夠實現克隆的Java類必須實現一個標識接口Cloneable,表示這個Java類支持復制
    • 如果一個類沒有實現這個接口但是調用了clone()方法,Java編譯器將拋出一個CloneNotSupportedException異常
  • Client:客戶類
public class PrototypeDemo implements Cloneable {......public Object clone() {Object object = null;try {object = super.clone();} catch (CloneNotSupportedException exception) {System.err.println("Not support cloneable");}return object;}......}
  • 深克隆
    • 使用原型模式克隆對象時,其成員對象也克隆
  • 淺克隆
    • 使用原型模式克隆對象時,其成員對象不克隆

帶原型管理器的原型模式

模式分析

  • 優點
    • 當創建新的對象實例較為復雜時,使用原型模式可以簡化對象的創建過程,通過一個已有實例可以提高新實例的創建效率
    • 可以動態增加或減少產品類
    • 原型模式提供了簡化的創建結構
    • 可以使用深克隆的方式保存對象的狀態
  • 缺點
    • 需要為每一個類配備一個克隆方法,而且這個克隆方法需要對類的功能進行通盤考慮,對已有的類進行改造時可能修改其源代碼
      • 違背開閉原則
    • 在實現深克隆時需要編寫較為復雜的代碼

適用環境

  • 創建新對象成本較大,新的對象可以通過原型模式對已有對象進行復制來獲得
    • 如果是相似對象,則可以對其屬性稍作修改
  • 如果系統要保存對象的狀態,而對象的狀態變化很小,或者對象本身占內存不大的時候,也可以使用原型模式配合備忘錄模式來應用
    • 相反,如果對象的狀態變化很大,或者對象占用的內存很大,那么采用狀態模式會比原型模式更好
  • 需要避免使用分層次的工廠類來創建分層次的對象,并且類的實例對象只有一個或很少的幾個組合狀態,通過復制原型對象得到新實例可能比使用構造函數創建一個新實例更加方便。

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

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

相關文章

基于深度學習的智能交通流量預測系統:技術與實踐

前言 隨著城市化進程的加速,交通擁堵問題日益嚴重,給人們的日常生活和經濟發展帶來了巨大的挑戰。智能交通系統(ITS)作為解決交通問題的重要手段,逐漸成為研究的熱點。其中,交通流量預測是智能交通系統中的…

Cilium動手實驗室: 精通之旅---23.Advanced Gateway API Use Cases

Cilium動手實驗室: 精通之旅---23.Advanced Gateway API Use Cases 1. Lab說明1.1 高級網關 API 使用案例 2. 負載均衡器2.1 部署應用程序2.2 部署 Gateway 和 HTTPRoute 3. HTTP 標頭請求修飾符3.1 部署 HTTPRoute3.2 可觀測性 4. HTTP 響應標頭重寫5. HTTP 流量鏡像5.1 demo應…

Agentic Workflow是什么?Agentic Workflow會成為下一個AI風口嗎?

無論是想要學習人工智能當做主業營收,還是像我一樣作為開發工程師但依然要運用這個顛覆開發的時代寵兒,都有必要了解、學習一下人工智能。 近期發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,入行門檻低&#x…

Some chunks are larger than 500 KiB after minification. Consider

在 vue3vite 項目開發中,build 打包時出現以下警告報錯: (!) Some chunks are larger than 500 KiB after minification. Consider: - Using dynamic import() to code-split the application - Use build.rollupOptions.output.manualChunks to improve…

NodeJS11和10以及之前的版本,關鍵差異?

Node.js 11 相比 10(及更早版本),除了事件循環行為的重大改變,還有多個核心模塊和底層機制的升級。以下是它們的關鍵差異和新特性對比,幫助你快速掌握兩個版本的重要變化。 🔧 一、事件循環行為變化&#x…

調和級數 斂散性

調和級數的斂散性是一個非常經典的問題。我們來全面分析它。 🧠 調和級數定義 調和級數是指: ∑ n 1 ∞ 1 n 1 1 2 1 3 1 4 ? \sum_{n1}^{\infty} \frac{1}{n} 1 \frac{1}{2} \frac{1}{3} \frac{1}{4} \cdots n1∑∞?n1?121?31?41?? …

Python?元組集合字符串

????˙?˙? ? 元組🛥?創建訪問修改解包其他操作比較的依據 集合🛸創建添加和刪除其他操作 字符串🪂創建索引和切片基本操作連接加號join() 重復查找in 關鍵字index()find()startswith()endswith() ??替換??分割??大小寫刪除 能…

??信息系統項目管理師-項目整合管理 知識點總結與例題分析??

??一、項目整合管理概述?? ??1. 定義與重要性?? 項目整合管理是項目管理知識領域中的核心過程,它協調所有其他知識領域的過程和活動,確保項目各要素有效整合。其核心目標是: ??統一項目目標??:確保各要素服務于共同目標??協調沖突??:解決項目執行中的各…

『uniapp』onThemeChange監聽主題樣式,動態主題不正確生效,樣式被覆蓋的坑

目錄 問題示例代碼解決思路1(缺點影響顯示效果有延遲)解決思路2——通過路由刷新頁面(缺點只適用于部分網頁)解決思路3——vuex(沒學會~)總結 歡迎關注 『uniapp』 專欄,持續更新中 歡迎關注 『…

LeetCode 高頻 SQL 50 題(基礎版)【題解】合集

點擊下方標題可跳轉至對應部分: LeetCode 高頻 SQL 50 題(基礎版)之 【查詢】部分 LeetCode 高頻 SQL 50 題(基礎版)之 【連接】部分 上 LeetCode 高頻 SQL 50 題(基礎版)之 【連接】部分 下…

Jenkins 全面深入學習目錄

Jenkins 全面深入學習目錄 第一部分:Jenkins 基礎入門 Jenkins 概述 持續集成/持續交付(CI/CD)概念Jenkins 的歷史與發展Jenkins 與其他 CI/CD 工具的比較 Jenkins 安裝與配置 系統要求與環境準備不同操作系統下的安裝方法初始配置與安全設置插件管理系統 Jenkins…

安裝laravel11和laravel12的一些報錯問題解決

前言 今天在安裝laravel的過程中遇到一些報錯問題,記錄一下。 laravel 12 Root composer.json requires laravel/tinker ^2.10.1, found laravel/tinker[2.x-dev] but it does not match your minimum-stability laravel/framework[v12.0.0, ..., v12.15.0] requ…

Oracle21cR3之客戶端安裝錯誤及處理方法

文章目錄 Oracle21cR3客戶端安裝1. 下載2. 安裝解壓到指定位置,如下:2. 安裝 3. 常見錯誤1. 無法將 JINSHENGYUAN\jinshengyuan 安裝用戶添加到 %2% 組。1. 問題原因分析2. 處理方法 Oracle21cR3客戶端安裝 1. 下載 官網下載 2. 安裝 解壓到指定位置…

web3 資訊網址

1. 新聞 幣圈導航| 區塊鏈導航| WEB3導航 | 聚合幣圈交易所、行情工具、空投資訊、DeFi入口及行業動態,一站式區塊鏈資源門戶網站 2.github位置 https://github.com/itgoyo/awesome-crypto

【C++】簡單商品價格計算程序練習

相信你是最棒噠!!! 文章目錄 一、題目代碼 二、題目解析 1.解析版 2.簡潔版 總結 一、題目代碼 構建一個類book,其中含有兩個私有數據成員qu和price,將price初始化為qu的10倍,建立一個有5個元素的數組對象,將qu初始化為6~10。要求通過對象指針訪問對象數組,按相反的順序…

現代數據工程實踐:基于Dagster的ETL架構設計與實現

在當今數據驅動的世界中,有效的數據處理流程至關重要。本文將帶您通過一個完整的教程,學習如何使用Dagster構建一個功能強大的ETL(提取、轉換、加載)管道。無論您是數據工程師、分析師還是對數據流水線感興趣的技術愛好者,本教程都將為您提供…

golang-linux環境配置

下載源碼包 :All releases - The Go Programming Language 解壓文件 sudo tar -zxvf go1.24.4.linux-amd64.tar.gz -C /usr/local/ 配置環境 vim ~/.bashrc 在配置文件最后加上下面三行: # 設置GO語言的路徑 export GOROOT/usr/local/go # 當前go…

【模擬 貪心】B4207 [常州市賽 2021] 戰士|普及+

B4207 [常州市賽 2021] 戰士 題目背景 搬運自 http://czoj.com.cn/p/443。數據為民間數據。 題目描述 小 X \text X X 在玩一款操控戰士和怪物戰斗的游戲。戰士初始生命值為 iH \text{iH} iH 、初始攻擊力為 iA \text{iA} iA 。怪物只有一個,初始生命值為 H…

37-Oracle 23 ai Shrink Tablespace(一鍵收縮表空間)

小伙伴們有沒有經歷過,超大表和超大數據的導入后,數據被刪除了,然而空間遲遲不釋放,存儲添置又跟不上,業務空間告警的時候。收縮就很必須了,然而收縮需謹慎,數據大過天。DBMS_SPACE.SHRINK_TABL…

我自己動手寫了一個MySQL自動化備份腳本,基于docker

MySQL自動化備份Docker方案 該方案僅需通過 Docker Compose 就能輕松完成部署。你可以自由配置數據庫連接信息,無論是遠程數據庫,還是本地數據庫,都能實現無縫對接。在備份頻率設置上,支持按固定秒數間隔執行備份任務&#xff0c…