原型模式(Prototype Pattern)

来源:https://www.cnblogs.com/sorrymine/archive/2023/05/10/17389531.html
-Advertisement-
Play Games

模式動機 原型模式(Prototype Pattern)結構較為簡單,它是一種特殊的創建型模式,當需要創建大量相同或者相似對象時,可以通過對一個已有對象的複製獲取更多對象。Java語言提供了較為簡單的原型模式解決方案,只需要創建一個原型對象,然後通過在類中定義的克隆方法複製自己。該模式應用較為廣泛, ...


模式動機

原型模式(Prototype Pattern)結構較為簡單,它是一種特殊的創建型模式,當需要創建大量相同或者相似對象時,可以通過對一個已有對象的複製獲取更多對象。Java語言提供了較為簡單的原型模式解決方案,只需要創建一個原型對象,然後通過在類中定義的克隆方法複製自己。該模式應用較為廣泛,可以快速生成大量的相似對象,極大提高了創建新實例的效率。


總結一下就是
  • 複製一個對象,從而克隆出多個與原型對象一模一樣的對象
  • 有些對象的創建過程較為複雜,而且需要頻繁創建
  • 通過給出一個原型對象來指明所要創建的對象的類型,然後用複製這個原型對象的辦法創建出更多同類型的對象

模式定義

  • 原型模式是一種對象創建型模式,用原型實例指定創建對象的種類,並且通過複製這些原型創建新的對象。
  • 原型模式允許通過一個原型對象創建一個或多個同類型的其他對象,而無須知道任何創建的細節

工作原理


模式結構

image

模式分析

  • 淺克隆(Shallow Clone):當原型對象被覆制時,只複製它本身和其中包含的值類型的成員變數,而引用類型的成員變數並沒有複製
  • 深克隆(Deep Clone):除了對象本身被覆制外,對象所包含的所有成員變數也將被覆制

  • 原型模式優點

    • 簡化對象的創建過程,通過複製一個已有實例可以提高新實例的創建效率
    • 擴展性較好
    • 簡化創建結構,原型模式中產品的複製是通過封裝在原型類中的克隆方法實現的,無須專門的工廠類來創建產品
    • 可以使用深克隆的方式保存對象的狀態,以便在需要的時候使用,可輔助實現撤銷操作
  • 原型模式缺點

    • 需要為每一個類配備一個克隆方法,而且該克隆方法位於一個類的內部,當對已有的類進行改造時,需要修改源代碼,違背了開閉原則。
    • 在實現深克隆時需要編寫較為複雜的代碼,而且當對象之間存在多重的嵌套引用時,為了實現深克隆,每一層對象對應的類都必須支持深克隆,實現起來可能會比較麻煩。
  • 使用情形

    • 創建新對象成本較大,新對象可以通過複製已有對象來獲得,如果是相似對象,則可以對其成員變數稍作修改
    • 系統要保存對象的狀態,而對象的狀態變化很小
    • 需要避免使用分層次的工廠類來創建分層次的對象

擴展
原型管理器(Prototype Manager)將多個原型對象存儲在一個集合中供客戶端使用,它是一個專門負責克隆對象的工廠,其中定義了一個集合用於存儲原型對象,如果需要某個原型對象的一個克隆,可以通過複製集合中對應的原型對象來獲得。
原型管理器中針對抽象類型編程,以便擴展。

原型管理器類
public class PrototypeManager {
    private Hashtable prototypeTable=new Hashtable();  //Hashtable存儲原型對象
    public PrototypeManager() {
        prototypeTable.put("A", new ConcretePrototypeA());
        prototypeTable.put("B", new ConcretePrototypeB());
    }
    public void add(String key, Prototype prototype) {
        prototypeTable.put(key,prototype);
    }
    public Prototype get(String key) {
        Prototype clone = null;
        clone = ((Prototype)prototypeTable.get(key)).clone(); //克隆方法創建新對象
        return clone;
    }
}



本文來自博客園,作者:街酒,轉載請註明原文鏈接:https://www.cnblogs.com/sorrymine/p/17389531.html


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

-Advertisement-
Play Games
更多相關文章
  • 摘要:本文分析了分散式資料庫發展情況、分散式資料庫應用的主要問題,從行業應用的角度給出了分散式資料庫發展的建議。 本文分享自華為雲社區《數字化轉型下我國分散式資料庫應用挑戰及發展建議》,作者:資料庫領域科學家、華為雲資料庫GaussDB首席專家 馮柯。 當前,金融等重點行業都在進行數字化轉型,而分佈 ...
  • 1 麻煩的地方 在SQL Server的官方文檔裡面可以看到備份和還原的表,但是這些表裡面只能找到備份成功的相關信息,無法找到備份失敗的記錄,比如msdb.dbo.backupset。對於一些監控系統未監控作業的情況下,想要監控資料庫備份任務執行失敗而觸發告警規則,有些麻煩。 但是SQL serve ...
  • 源碼地址:https://ext.dcloud.net.cn/plugin?id=12272 ...
  • 😊在Nuxt3.0項目中用到了可視化圖表📊,於是我用了EChart可視化圖表庫。但是在官網我沒有找到針對在Nuxt3.0中使用EChart的方法,於是在這裡記錄我的引入EChart並簡單使用的步驟。需要聲明的是,本文只針對在Nuxt3.0項目中使用EChart.js庫的可視化圖表進行講解,不針對 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 先上效果 前言 最近在學Three.js.,對著文檔看了一周多,正好趕上碼上掘金的活動,就順便寫了一個小demo,手搓一個羅盤特效。 太極 先來看一下太極的實現方式,這裡我們使用CircleGeometry,將其分解開來可以看出是由圓形和 ...
  • 我們是袋鼠雲數棧 UED 團隊,致力於打造優秀的一站式數據中台產品。我們始終保持工匠精神,探索前端道路,為社區積累並傳播經驗價值。。 本文作者:奇銘(掘金) 需求背景 前段時間,離線計算產品接到改造數據同步表單的需求。 一方面,數據同步模塊的代碼可讀性和可維護性比較差,相對應的,在數據同步模塊開發新 ...
  • <meta> 標簽是 HTML 中用於描述網頁元信息的元素。它位於 <head> 部分,不會顯示在頁面內容中,但對於瀏覽器、搜索引擎等具有重要作用。主要作用有:定義文檔的字元編碼、提供網頁的描述信息、關鍵詞、作者、視口設置等,這些信息有助於搜索引擎理解和索引網頁內容。 <meta> 標簽的主要屬性有 ...
  • 當前,前端對二進位數據有許多的API可以使用,這豐富了前端對文件數據的處理能力,有了這些能力,就能夠對圖片等文件的數據進行各種處理。 本文將著重介紹一些前端二進位數據處理相關的API知識,如Blob、File、FileReader、ArrayBuffer、TypeArray、DataView等等。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...