大白話原型模式(Prototype Pattern)

来源:https://www.cnblogs.com/zcr3108346262/archive/2020/01/18/12209384.html
-Advertisement-
Play Games

意圖 原型模式是創建型設計模式,可以複製已存在的對象而無需依賴它的類。 問題 假如現在有一個對象,我們想完全複製一份新的,我們該如何做? 1. 創建同一個類的新對象 2. 遍歷所有已存在對象的值,然後將他們的值複製到新對象。 很好,但是我們會發現存在如下問題: 1. 該對象的值並不一定全對對外開放, ...


意圖

原型模式是創建型設計模式,可以複製已存在的對象而無需依賴它的類。

問題

假如現在有一個對象,我們想完全複製一份新的,我們該如何做?

  1. 創建同一個類的新對象
  2. 遍歷所有已存在對象的值,然後將他們的值複製到新對象。

很好,但是我們會發現存在如下問題:

  1. 該對象的值並不一定全對對外開放,比如Java中的private,外部無法訪問。
  2. 使用這種辦法必須知道該對象所屬的類而且依賴這個類。
  3. 有些時候我們只知道該對象實現的介面,而不是具體的實現類。

解決

這個時候我們就需要原型模式。原型模式將克隆過程委托給被克隆的對象。該模式為所有支持克隆的對象聲明一個公共介面,這個介面允許克隆一個對象,而不必將代碼和該對象的類耦合。通常,這樣的介面只包含一個克隆方法。

克隆方法的實現在所有類中都非常相似。該方法創建當前類的一個對象,並將舊對象的所有欄位值轉移到新對象中。這樣就可以複製私有欄位,因為大多數編程語言都允許對象訪問屬於同一類的私有欄位。

結構

原型模式類圖

原型模式包含如下角色

  • Prototype:它是聲明克隆方法的介面,是所有具體原型類的公共父類,可以是抽象類也可以是介面,甚至還可以是具體實現類。
  • ConcretePrototype:它實現在抽象原型類中聲明的克隆方法,在克隆方法中返回自己的一個克隆對象

實例

在Java中,所有的類都繼承了java.lang.Object。Object提供了clone方法能實現Java對象複製。
我們只需註意兩點即可。

  1. 實現克隆的Java類必須實現一個標識介面Cloneable,表示這個Java類支持被覆制。如果沒有實現這個介面但調用了clone()方法,Java編譯器將拋出一個CloneNotSupportedException異常。
  2. 淺克隆和深克隆
    java的clone函數只是“淺克隆”,也就是僅對變數值做複製。如果是引用變數,其內容指向的記憶體地址是不變的。

參考文獻

https://refactoring.guru/design-patterns/prototype


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • react native運行helloword 今天是個特殊的時刻,我前天開始學習react native,一直環境塔建出錯,運行打包出錯,今晚,我終於把這個難搞的環境給搭建好了,併成功運行了第一個helloword!! 這個環境:python2+java jdk+Android 我全部是照著官網弄 ...
  • 分享一些基礎小白們可能不知道的東西、以及一些基礎的知識的註意事項 ...
  • 引言 在 "上一篇文章" 中我們通過 腳手架快速搭建了一個簡單的示例,並基於該示例講解了在類組件中 和`React.PureComponent @babel/preset react render React.createElement React.createElement ReactElemen ...
  • Json的介紹和Json結構 JSON是JavaScript Object Notation的縮寫,意思是JavaScript 對象表示法 是存儲和交換文本信息的語法。類似 XML,不過它比 XML 更小、更快,更易解析 官網的介紹 http://www.json.org/json zh.html ...
  • 在用到el-tree的懶載入和預設勾選功能時,若第一次勾選前幾個連續節點,第二次進入預設勾選時,由於el-tree子節點尚未完全載入(只載入出來前幾個),預設勾選已經開始(已載入出來的子節點被預設勾選),這時el-tree會認為子節點全部勾選,所以父節點也被勾選,這就導致所有子節點都被勾選; 解決方 ...
  • 本篇不會過多講述 ts 語法,著重記錄下 在 React 中使用 ts 的方法以及踩坑經過。 ...
  • 0.效果演示 插入視頻插不進來,就很煩。可以出門右拐去優酷看下(點我!)。 1.準備工作 1.1前端框架 前端使用了基於vue.js的nuxt.js。為什麼使用nuxt.js? 首先我做的是博客的項目,所以SSR至關重要。雖然跟本文要講的登錄註冊沒有什麼關係,但是文章如果用axios來非同步獲取的話, ...
  • X 維度本身超出了技術範疇,但為了更好地服務業務,技術人也有必要懂得一些基礎的業務優化思路。如果只知道埋頭趕路,不知道抬頭看天,那我們技術人很容易做了費力不討好的事情,例如:某些性能瓶頸是由於業務流程設計不合理導致的,在業務流程優化完善之前,我們僅僅從技術視角去優化改善,極有可能事倍功半。具體說來,... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...