8.原型模式(Prototype)

動機

在軟件系統中,經常面臨著某些結構復雜的對象的創建工作;由于需求的變化,這些對象經常面臨著劇烈的變化,但是它們卻擁有比較穩定一致的接口。

之前的工廠方法和抽象工廠將抽象基類和具體的實現分開。原型模式也差不多,但是原型模式將抽象基類合并。

原型模式的應用場景

原型模式特別適用于以下場景:

  • 對象的創建過程比較復雜或耗時。
  • 需要動態創建對象,且對象的類型在運行時才能確定。
  • 需要避免重復初始化對象的開銷。
#include <iostream>
#include <memory>
#include <string>// 抽象類
class ISplitter {
public:virtual void split() = 0;virtual std::unique_ptr<ISplitter> clone() const = 0; // 返回一個智能指針virtual ~ISplitter() {}
};// 二進制拆分器
class BinarySplitter : public ISplitter {
private:std::string data; // 假設這是需要拆分的二進制數據
public:BinarySplitter(const std::string& data) : data(data) {}void split() override {std::cout << "Splitting binary data: " << data << std::endl;// 具體的二進制拆分邏輯}std::unique_ptr<ISplitter> clone() const override {return std::make_unique<BinarySplitter>(*this); // 深拷貝}
};// 文本拆分器
class TxtSplitter : public ISplitter {
private:std::string data; // 假設這是需要拆分的文本數據
public:TxtSplitter(const std::string& data) : data(data) {}void split() override {std::cout << "Splitting text data: " << data << std::endl;// 具體的文本拆分邏輯}std::unique_ptr<ISplitter> clone() const override {return std::make_unique<TxtSplitter>(*this); // 深拷貝}
};// 使用示例
int main() {// 創建原始對象BinarySplitter binarySplitter("01010101");TxtSplitter txtSplitter("Hello, World!");// 克隆對象std::unique_ptr<ISplitter> binaryClone = binarySplitter.clone();std::unique_ptr<ISplitter> txtClone = txtSplitter.clone();// 使用克隆對象binaryClone->split();txtClone->split();return 0;
}

模式定義

使用原型實例指定創建對象的種類,然后通過拷貝這些原型來創建新的對象。

什么時候使用原型,什么時候使用工廠最大的區分點就在于:用工廠方法創建對象是不是非常簡單的幾個步驟就可以把這個對象創建出來,還是說需要考慮對象很復雜的中間狀態,然后又很希望保留這個中間狀態,如果是后者的話就用原型。

要點總結

Prototype模式同樣用于隔離類對象的使用者和具體類型(易變類)之間的耦合關系,它同樣要求這些“易變類”擁有穩定的接口。

Prototype模式對于“如何創建易變類”的實體對象“采用”原型克隆的方法來做,它使得我們可以非常靈活地動態創建“擁有某些穩定接口”的新對象–所需工作僅僅是注冊一個新類的對象(即原型),然后在任何需要的地方Clone。

Prototype模式中的Clone方法可以利用某些框架中的序列化來實現深拷貝。

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

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

相關文章

LabVIEW如何高頻采集溫度數據?

在LabVIEW中進行高頻溫度數據采集時&#xff0c;選擇合適的傳感器&#xff08;如熱電偶或熱電阻&#xff09;和采集硬件是關鍵。下面是一些建議&#xff0c;幫助實現高效的溫度數據采集&#xff1a; 1. 傳感器選擇&#xff1a; 熱電偶&#xff08;Thermocouple&#xff09;&am…

Kotlin 委托詳解

Kotlin 委托詳解 引言 Kotlin 作為一種現代化的編程語言&#xff0c;在 Android 開發等領域得到了廣泛的應用。在 Kotlin 中&#xff0c;委托&#xff08;Delegation&#xff09;是一種強大的特性&#xff0c;它可以讓我們以更簡潔的方式實現代碼的復用和擴展。本文將詳細解析…

npm 和 pip 安裝中常見問題總結

安裝路徑的疑惑&#xff1a;NPM 和 PIP 的安裝機制 NPM 安裝路徑規則&#xff1a; 依賴安裝在項目目錄下&#xff1a; 當你運行 npm install --save-dev jest&#xff0c;它會在當前目錄&#xff08;例如 F:\&#xff09;下創建一個 node_modules 文件夾&#xff0c;把 jest 安…

人工智能:農業領域的變革力量

在當今科技飛速發展的時代&#xff0c;人工智能正以前所未有的態勢滲透進各個領域&#xff0c;農業也不例外。想象一下&#xff0c;未來的農田里&#xff0c;農民不再是彎腰勞作的形象&#xff0c;而是坐在高科技的“智能農場”里&#xff0c;悠閑地喝著咖啡&#xff0c;指揮著…

LLM的Deep Research功能:重構人類認知與創新的新范式

在人工智能迅速發展的今天&#xff0c;大語言模型&#xff08;LLM&#xff09;的deep research功能正在成為重構人類認知方式的關鍵力量。 這一突破性的技術進展不僅帶來了工具層面的革新&#xff0c;更深刻地觸及了人類認知能力的本質。 本文將從認知科學的視角出發&#xf…

【Cadence仿真技巧學習筆記】求解65nm庫晶體管參數un, e0, Cox

在設計放大器的第一步就是確定好晶體管參數和直流工作點的選取。通過閱讀文獻&#xff0c;我了解到L波段低噪聲放大器的mos器件最優寬度計算公式為 W o p t . p 3 2 1 ω L C o x R s Q s p W_{opt.p}\frac{3}{2}\frac{1}{\omega LC_{ox}R_{s}Q_{sp}} Wopt.p?23?ωLCox?Rs…

前端力扣刷題 | 6:hot100之 矩陣

73. 矩陣置零 給定一個 m x n 的矩陣&#xff0c;如果一個元素為 0 &#xff0c;則將其所在行和列的所有元素都設為 0 。請使用 原地 算法。 法一&#xff1a; var setZeroes function(matrix) {let setX new Set(); // 用于存儲需要置零的行索引let setY new Set(); //…

每日一題——有效括號序列

有效括號序列 題目描述數據范圍&#xff1a;復雜度要求&#xff1a; 示例題解代碼實現代碼解析1. 定義棧和棧操作2. 棧的基本操作3. 主函數 isValid4. 返回值 時間和空間復雜度分析 題目描述 給出一個僅包含字符 (, ), {, }, [, ] 的字符串&#xff0c;判斷該字符串是否是一個…

集合通訊概覽

&#xff08;1&#xff09;通信的算法 是根據通訊的鏈路組成的 &#xff08;2&#xff09;因為通信鏈路 跟硬件強相關&#xff0c;所以每個CCL的庫都不一樣 芯片與芯片、不同U之間是怎么通信的&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 很重要…

紅黑樹的封裝

一、封裝思路 在 STL 中 map set 的底層就是封裝了一棵紅黑樹。 其中連接紅黑樹和容器的是迭代器&#xff0c;map set 暴露出的接口都不是自己寫的&#xff0c;而是紅黑樹寫的&#xff0c;外部接口封裝紅黑樹接口。 所以寫出紅黑樹為 map set 寫的接口&#xff0c;再在上層的…

java異常處理——try catch finally

單個異常處理 1.當try里的代碼發生了catch里指定類型的異常之后&#xff0c;才會執行catch里的代碼&#xff0c;程序正常執行到結尾 2.如果try里的代碼發生了非catch指定類型的異常&#xff0c;則會強制停止程序&#xff0c;報錯 3.finally修飾的代碼一定會執行&#xff0c;除…

使用QMUI實現用戶協議對話框

使用QMUI實現用戶協議對話框 懶加載用于初始化 TermServiceDialogController 對象。 懶加載 lazy var 的作用 lazy var dialogController: TermServiceDialogController {let r TermServiceDialogController()r.primaryButton.addTarget(self, action: #selector(primaryC…

C++進階: 紅黑樹及map與set封裝

紅黑樹總結整理 紅黑色概述&#xff1a; 紅黑樹整理與AVL樹類似&#xff0c;但在對樹的平衡做控制時&#xff0c;AVL樹會比紅黑樹更嚴格。 AVL樹是通過引入平衡因子的概念進行對樹高度控制。 紅黑樹則是對每個節點標記顏色&#xff0c;對顏色進行控制。 紅黑樹控制規則&…

在Qt中,slots 關鍵字有什么用?

有下面的Qt代碼&#xff1a; #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACEclass MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent nullptr…

列表標簽(無序列表、有序列表)

無序列表 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head><…

Kanass基礎教程-創建項目

Kanass是一款國產開源免費的項目管理工具&#xff0c;工具簡潔易用&#xff0c;開源免費&#xff0c;之前介紹過kanass的一些產品簡介及安裝配置方法&#xff0c;本文就從如何創建第一個項目來開始kanass上手之旅吧。 1. 創建項目 點擊項目->項目添加 按鈕進入項目添加頁面…

【Numpy核心編程攻略:Python數據處理、分析詳解與科學計算】2.10 ndarray內存模型:從指針到緩存優化

2.10 ndarray內存模型&#xff1a;從指針到緩存優化 目錄 #mermaid-svg-p0zxLYqAnn59O2Xe {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-p0zxLYqAnn59O2Xe .error-icon{fill:#552222;}#mermaid-svg-p0zxLYqAnn59O…

80-《紅球姜》

紅球姜 紅球姜&#xff08;學名&#xff1a;Zingiber zerumbet (L.) Smith&#xff09;是姜科姜屬多年生草本植物&#xff0c;根莖塊狀&#xff0c;株高可達2米。葉片披針形至長圓狀披針形&#xff0c;無柄或短柄&#xff1b;總花梗長可達30厘米&#xff0c;花序球果狀&#xf…

Hive之數據定義DDL

Hive之數據定義DDL 文章目錄 Hive之數據定義DDL寫在前面創建數據庫查詢數據庫顯示數據庫查看數據庫詳情切換當前數據庫 修改數據庫刪除數據庫創建表管理表(內部表)外部表管理表與外部表的互相轉換 修改表重命名表增加、修改和刪除表分區增加/修改/替換列信息 刪除表 寫在前面 …

DeepSeek 核心技術全景解析

DeepSeek 核心技術全景解析&#xff1a;突破性創新背后的設計哲學 DeepSeek的創新不僅僅是對AI基礎架構的改進&#xff0c;更是一場范式革命。本文將深入剖析其核心技術&#xff0c;探討 如何突破 Transformer 計算瓶頸、如何在 MoE&#xff08;Mixture of Experts&#xff09…