原型模式(Prototype Pattern) C++

上一節:建造者模式(Builder Pattern)C++

文章目錄

  • 0.理論
    • 1.原型模式的核心組成:
    • 2.實現方法
    • 3.什么時候使用
  • 1.實踐
    • 步驟 1: 定義怪物原型
    • 步驟 2: 實現具體怪物原型
    • 步驟 3: 使用原型創建怪物

0.理論

原型模式(Prototype Pattern)是一種創建型設計模式,其思想是基于一個原型實例創建對象的副本,從而避免新實例創建時的標準方式(如使用new關鍵字)。在需要創建的對象與原有對象類似或者創建過程較為復雜時,使用原型模式可以更高效地復制對象。

在這里插入圖片描述

1.原型模式的核心組成:

  • 原型(Prototype):一個接口或抽象類,定義了復制(克隆)自身的方法。
  • 具體原型(Concrete Prototype):實現原型接口的類的實例,這個實現包括如何克隆自身的具體操作。
  • 客戶(Client):使用原型實例創建新對象的類。

2.實現方法

  • 淺克隆(Shallow Clone):復制對象時僅復制對象本身和對象中的原始類型的字段值,而不復制對象引用指向的對象。淺克隆可以快速復制,但不包括對象內部的引用對象。
  • 深克隆(Deep Clone):復制對象時,除了對象本身和原始類型的字段值外,還遞歸地復制對象中的所有引用對象。深克隆使得副本與原始對象在結構上完全獨立,修改副本不會影響原始對象。

3.什么時候使用

  • 當直接創建一個對象的成本較高或復雜時,使用原型模式可以簡化對象的創建過程。
  • 當需要重復地創建相似對象時,可以利用已有對象進行克隆,減少創建對象的開銷。
  • 當需要實現對象的撤銷和恢復功能時,通過保存對象的克隆副本來實現。

1.實踐

假設我們正在開發一個游戲,其中包含大量的怪物。這些怪物分為幾種類型,比如“地精”、“龍”等。每種怪物都有自己的屬性(如生命值、攻擊力等),但同種類型的怪物在初始狀態下這些屬性是相同的。在游戲中,我們需要頻繁地創建同類型的怪物實例。為了提高性能和簡化創建過程,我們可以使用原型模式來實現怪物的創建。

步驟 1: 定義怪物原型

首先,定義一個怪物原型基類,其中包含一個虛擬的克隆方法:

#include <iostream>// 怪物原型基類
class Monster {
public:virtual ~Monster() {}virtual Monster* clone() const = 0;virtual void attack() const = 0;
};

步驟 2: 實現具體怪物原型

然后,為每種怪物類型實現具體的原型類:

// 地精怪物
class Goblin : public Monster {
public:Goblin* clone() const override {return new Goblin(*this);}void attack() const override {std::cout << "Goblin attacks! Damage: 10" << std::endl;}
};// 龍怪物
class Dragon : public Monster {
public:Dragon* clone() const override {return new Dragon(*this);}void attack() const override {std::cout << "Dragon breathes fire! Damage: 100" << std::endl;}
};

步驟 3: 使用原型創建怪物

最后,在游戲邏輯中,我們可以通過克隆原型來創建新的怪物實例:

int main() {// 創建原型Goblin* goblinPrototype = new Goblin();Dragon* dragonPrototype = new Dragon();// 克隆新怪物Monster* goblin1 = goblinPrototype->clone();Monster* dragon1 = dragonPrototype->clone();// 使用怪物實例進行攻擊演示goblin1->attack();dragon1->attack();// 清理資源delete goblinPrototype;delete dragonPrototype;delete goblin1;delete dragon1;return 0;
}

原型模式可以在不知道對象具體類型的情況下克隆對象,并減少子類的構造。也可以可以避免構造函數的約束,因為對象的復制通常是通過某種復制方法實現的。

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

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

相關文章

7-liunx服務器規范

目錄 概況liunx日志liunx系統日志syslog函數openlog 可以改變syslog默認輸出方式 &#xff0c;進一步結構化 用戶信息進程間的關系會話ps命令查看進程關系 系統資源限制改變工作目錄和根目錄服務器程序后臺話 概況 liunx服務器上有很多細節需要注意 &#xff0c;這些細節很重要…

服務網格Service Mesh和Istio

文章目錄 服務網格&#xff08;Service Mesh&#xff09;市場上三種服務網格解決方案服務網格的特征流量管理安全性可觀察性 Istio簡介Istio提供了什么功能服務 &#xff1f;Istio 核心特性流量管理安全可觀察性 平臺支持 服務網格&#xff08;Service Mesh&#xff09; 服務網…

Eureka注冊中心(黑馬學習筆記)

Eureka注冊中心 假如我們的服務提供者user-service部署了多個實例&#xff0c;如圖&#xff1a; 大家思考幾個問題&#xff1a; order-service在發起遠程調用的時候&#xff0c;該如何得知user-service實例的ip地址和端口&#xff1f; 有多個user-service實例地址&#xff0c…

六、行列式基本知識

目錄 1、行列式的特性 2、行列式的計算方法: 2.1 通過行列式的定義去計算:對角法則。 2. 2 利用行列式的性質將行列式轉化為上三角行列式: ①行列式的性質 : 性質一: 性質二: 性質三: 性質四:行列式之間的加法

TreeData 數據查找

TreeData 數據查找 最近做需求的時候遇到了這樣的一個需求&#xff0c;Tree組件數據支持查找&#xff0c;而且TreeData的數據層級是無限級的 開始想的事借助UI組件庫&#xff08;Ant-design-vue&#xff09;中的Tree組件的相關方法直接實現,看了下api 發現沒法實現&#xff0c;…

超級實用的python代碼片段匯總和詳細解析(16個)

目錄 1. 生成隨機文本 2. 計算文本文件中的字數 3. 替換文件文件中的字串 4. 多文件名的批量替換 5. 從網站提取數據 6. 批量下載圖片 7.批量刪除空文件夾 8.Excel表格讀寫 9.合并Excel表格工作簿 10.數據庫SQL查詢 11. 系統進程查殺 12.圖像尺寸調整和裁剪 13.圖…

redis實現消息隊列redis發布訂閱redis監聽key

文章目錄 Redis消息隊列實現異步秒殺1. jvm阻塞隊列問題2. 什么是消息隊列3. Redis實現消息隊列1. 基于List結構模擬消息隊列操作優缺點 2. 基于PubSub發布訂閱的消息隊列操作優缺點spring 結合redis的pubsub使用示例1. 引入依賴2. 配置文件3. RedisConfig4. CustomizeMessageL…

大語言模型的開山之作—探秘GPT系列:GPT-1-GPT2-GPT-3的進化之路

模型模型參數創新點評價GPT1預訓練微調&#xff0c; 創新點在于Task-specific input transformations。GPT215億參數預訓練PromptPredict&#xff0c; 創新點在于Zero-shotZero-shot新穎度拉滿&#xff0c;但模型性能拉胯GPT31750億參數預訓練PromptPredict&#xff0c; 創新點…

pclpy 可視化點云(多窗口可視化、單窗口多點云可視化)

pclpy 可視化點云&#xff08;多窗口可視化、單窗口多點云可視化&#xff09; 一、算法原理二、代碼三、結果1.多窗口可視化結果2.單窗口多點云可視化 四、相關數據五、問題與解決方案1.問題2.解決 一、算法原理 原理看一下代碼寫的很仔細的。。目前在同一個窗口最多建立2個窗…

ESP8266智能家居(3)——單片機數據發送到mqtt服務器

1.主要思想 前期已學習如何用ESP8266連接WIFI&#xff0c;并發送數據到服務器。現在只需要在單片機與nodeMCU之間建立起串口通信&#xff0c;這樣單片機就可以將傳感器測到的數據&#xff1a;光照&#xff0c;溫度&#xff0c;濕度等等傳遞給8266了&#xff0c;然后8266再對數據…

Java Web3J :使用web3j調用自己的智能合約,返回一個內部有數組的對象結構時出現NPE問題

之前有寫過一篇文章Java Web3J :使用web3j調用自己的智能合約的方法(教程),當時只是簡單的方法調用,也不涉及到什么復雜的數據類型,入參是long類型,出參是String類型。 目錄 問題描述報錯信息嘗試解決控制變量法查看源碼網上查閱解決最后問題描述 遇到這個問題是因為有…

【AI應用】SoraWebui——在線文生視頻工具

SoraWebui 是一個開源項目&#xff0c;允許用戶使用 OpenAI 的 Sora 模型使用文本在線生成視頻&#xff0c;從而簡化視頻創建&#xff0c;并具有輕松的一鍵網站部署功能 在 Vercel 上部署 1. 克隆項目 git clone gitgithub.com:SoraWebui/SoraWebui.git 2. 安裝依賴 cd Sor…

本科畢業設計(論文)開題報告:基于人工智能的短視頻獲客平臺的設計與實現

目錄 1.選題概述1.題目背景2.目的及意義3.技術現狀 2.題目內容1.任務概述2.系統設計1.數據采集模塊&#xff1a;2.數據處理與分析模塊&#xff1a;3.客戶識別模塊&#xff1a;4.推廣策略模塊&#xff1a; 3.功能模塊1.數據采集模塊&#xff1a;2.數據處理與分析模塊&#xff1a…

【Java EE初階二十】http的簡單理解(一)

1. 初識http HTTP 最新的版本應該是 HTTP/3.0&#xff0c;目前大規模使用的版本 HTTP/1.1&#xff1b; 下面來簡單說明一下使用 HTTP 協議的場景: 1、瀏覽器打開網站 (基本上) 2、手機 APP 訪問對應的服務器 (大概率) 前面的 TCP與UDP 和http不同&#xff0c;HTTP 的報文格式&a…

React基礎-webpack+creact-react-app創建項目

學習視頻&#xff1a;學習視頻 2節&#xff1a;webpack工程化創建項目 2.1.webpack工程化工具&#xff1a;vite/rollup/turbopak; 實現組件的合并、壓縮、打包等&#xff1b; 代碼編譯、兼容、校驗等&#xff1b; 2.2.React工程化/組件開發 我們可以基于webpack自己去搭建…

sql-labs25-28a

一、環境 網上都有不過多闡述 二、sql-labs第25關 它說你的OR和and屬于它,那就是過濾了OR和and 注入嘗試 不用or和and進行爆破注入,很明顯是有注入點的 ?id-1 union select 1,2,3-- 查看數據庫 ok&#xff0c;此道題算是解了但是如果我們用了and了呢 ?id-1 and updatex…

淺談集群的分類

本文主要介紹集群部署相關的知識&#xff0c;介紹集群部署的基礎&#xff0c;集群的分類、集群的負載均衡技術&#xff0c;集群的可用性以及集群的容錯機制。隨后介紹Redis-Cluster以及Mysql的架構以及主從復制原理。 集群介紹 單臺服務器本身會受到帶寬、內存、處理器等多方面…

STM32-串口通信(串口的接收和發送)

文章目錄 STM32的串口通信一、STM32里的串口通信二、串口的發送和接收串口發送串口接收 三、串口在STM32中的配置四、串口接收的兩種實現方式1. 需要更改的地方2. 查詢RXNE標志位3. 使用中斷 總結 STM32的串口通信 本文在于記錄自己的學習過程中遇到的問題和總結&#xff0c;各…

golang,gin腳手架,完美集成與結構化,gin-restful-api模板gin-layout,開箱即用

關于gtools golang非常奈斯&#xff0c;gin作為web框架也非常奈斯&#xff0c;但我們在開發過程中&#xff0c;前期搭建會花費大量的時間&#xff0c;且還不盡人意。 為此我集成了gin-restful-api的模板gin-layout&#xff0c;還有腳手架一鍵生成項目。 集成相關 ginviperz…

大型語言模型的語義搜索(一):關鍵詞搜索

關鍵詞搜索(Keyword Search)是文本搜索種一種常用的技術&#xff0c;很多知名的應用app比如Spotify、YouTube 或 Google map等都會使用關鍵詞搜索的算法來實現用戶的搜索任務&#xff0c;關鍵詞搜索是構建搜索系統最常用的方法&#xff0c;最常用的搜索算法是Okapi BM25&#x…