C++設計模式|創建型 5.原型模式

1.什么是原型模式?

原型模式?種創建型設計模式,該模式的核?思想是基于現有的對象創建新的對象,?不是從頭開始創建。
在原型模式中,通常有?個原型對象,它被?作創建新對象的模板。新對象通過復制原型對象的屬性和狀態來創 建,??需知道具體的創建細節。

2.為什么要使用原型模式?

如果一個對象的創建過程比較復雜時(比如需要經過一系列的計算和資源消耗),那每次創建該對象都需要消耗資源,而通過原型模式就可以復制現有的一個對象來迅速創建/克隆一個新對象,不必關心具體的創建細節,可以降低對象創建的成本。

3.原型模式的基本結構

實現原型模式需要給【原型對象】聲明一個克隆方法,執行該方法會創建一個當前類的新對象,并將原始對象中的成員變量復制到新生成的對象中,而不必實例化。并且在這個過程中只需要調用原型對象的克隆方法,而無需知道原型對象的具體類型。

原型模式包含兩個重點模塊:

  • 抽象原型接口prototype: 聲明一個克隆自身的方法clone
  • 具體原型類ConcretePrototype: 實現clone方法,復制當前對象并返回一個新對象。

在客戶端代碼中,可以聲明一個具體原型類的對象,然后調用clone()方法復制原對象生成一個新的對象。

4.原型模式的實現過程

原型模式的實現過程即上面描述模塊的實現過程:

  • 創建一個抽象類或接口,聲明一個克隆方法clone
  • 實現具體原型類,重寫克隆方法(多態)
  • 客戶端中實例化具體原型類的對象,并調用其克隆方法來創建新的對象。

5.C++實現原型模式

【設計模式專題之原型模式】5. 矩形原型 (kamacoder.com)icon-default.png?t=N7T8https://kamacoder.com/problempage.php?pid=1083

題目描述:

公司正在開發一個圖形設計軟件,其中有一個常用的圖形元素是矩形。設計師在工作時可能需要頻繁地創建相似的矩形,而這些矩形的基本屬性是相同的(顏色、寬度、高度),為了提高設計師的工作效率,請你使用原型模式設計一個矩形對象的原型。使用該原型可以快速克隆生成新的矩形對象。

輸入描述:

首先輸入一個字符串,表示矩形的基本屬性信息,包括顏色、長度和寬度,用空格分隔,例如 "Red 10 5"。

然后輸入一個整數 N(1 ≤ N ≤ 100),表示使用原型創建的矩形數量。

輸出描述:

對于每個矩形,輸出一行字符串表示矩形的詳細信息,如 "Color: Red, Width: 10,Height: 5"。

輸入示例:

Red 10 5
3

輸出示例:

Color: Red, Width: 10, Height: 5
Color: Red, Width: 10, Height: 5
Color: Red, Width: 10, Height: 5

?代碼實現:

#include<iostream>
#include<string>
#include<vector>
using namespace std;// 定義抽象原型類
class Prototype{
public://聲明clone方法virtual Prototype* clone() const = 0;//為了方便打印信息,所以設計了這樣一個抽象函數。const表示不修改成員屬性virtual string getDetails() const = 0;//虛析構,寫成虛析構是為了防止子類創建在堆區時,父類的指針指向子類的對象,該指針無法釋放子類堆區的內存的問題virtual ~Prototype() {}};//定義矩形原型類
class RectanglePrototype : public Prototype{
//由于輸入的數據有矩形的顏色、長、寬,所以要有這些成員屬性
private:string color;int width;int heigth;public://初始化列表法實現構造函數。這里的列表一定要和private定義的順序一致RectanglePrototype(string Color, int Width, int Heigth): color(Color),width(Width),heigth(Heigth){} //具體化克隆方法Prototype* clone() const override{//因為clone方法要復制當前對象并返回一個新對象,所以這里使用了系統提供的拷貝構造函數對屬性進行值拷貝,return new RectanglePrototype(*this);}//具體化獲取細節的方法string getDetails() const override{return "Color: "+color + "," + " Width: "+ to_string(width)+"," + " Height: "+to_string(heigth);}};//客戶端代碼
int main()
{string s;int w, h, num;cin>>s>>w>>h;cin>>num;//vector<Prototype *> Rectangles;for(int i = 0; i<num; i++){// 創建原型對象并保存在數組中Prototype * rectangle = new RectanglePrototype(s,w,h);Rectangles.push_back(rectangle);}//克隆原型對象并輸出被克隆對象的信息for(const auto& rec : Rectangles){Prototype* clonedRectangle = rec->clone();  //值拷貝cout<<clonedRectangle->getDetails()<<endl;//釋放克隆對象內存delete clonedRectangle;}//釋放原型對象for(const auto& rec : Rectangles){delete rec;}return 0;
}

6.什么時候使用原型模式

相?于直接實例化對象,通過原型模式復制對象可以減少資源消耗,提?性能,尤其在對象的創建過程復雜或對象的創建代價較?的情況下。當需要頻繁創建相似對象、并且可以通過克隆避免重復初始化?作的場景時可以考慮使 ?原型模式,在克隆對象的時候還可以動態地添加或刪除原型對象的屬性,創造出相似但不完全相同的對象,提?了靈活性。
但是使?原型模式也需要考慮到如果對象的內部狀態包含了引?類型的成員變量,那么實現深拷?就會變得較為復 雜,需要考慮引?類型對象的克隆問題。

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

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

相關文章

Mac IDEA 自動補全mybatis sql語句

導航 Mac IDEA 自動補全mybatis sql語句一、點擊IDEA 右側Database選項二、選擇添加對應數據庫三、輸入數據庫信息和方案四、輸入數據庫信息和方案五、成功 Mac IDEA 自動補全mybatis sql語句 背景&#xff1a; 想在Mapper中&#xff0c;能夠實現自動檢索數據庫表和對應的字段…

QT日志類SimpleQtLogger的簡單記錄

在現代軟件開發中&#xff0c;日志記錄是必不可少的部分。它不僅幫助開發者在調試和維護軟件時了解程序的運行狀態&#xff0c;還能提供關鍵的錯誤信息。對于使用Qt框架開發應用程序的開發者來說&#xff0c;選擇一個合適的日志庫至關重要。本文將詳細介紹Qt日志庫SimpleQtLogg…

web前端之sass中的顏色函數、active按鈕激活、hover鼠標懸浮、disabled禁用、scss循環、css

MENU 效果圖htmlsassscss編譯后的css頁面css 效果圖 注意查看藍色按鈕。 html <div class"box"><button class"btn type_1">按鈕</button><button class"btn type_2">按鈕</button><button class"btn ty…

一文讀懂通用漏洞評分系統CVSS4.0:順帶理清CVE、CWE及其與CVSS之間的關系

事件響應和安全團隊論壇 (FIRST&#xff0c;Forum of Incident Response and Security Teams) 于 2023 年 11 月 1 日正式推出第四版通用漏洞評分系統 (CVSS 4.0&#xff0c;Common Vulnerability Scoring System version 4.0)。CVSS 4.0 是評估計算機系統安全漏洞嚴重性的行業…

C++ 多態性

一 多態性的分類 編譯時的多態 函數重載 運算符重載 運行時的多態 虛函數 1 運算符重載的引入 使用C編寫程序時&#xff0c;我們不僅要使用基本數據類型&#xff0c;還要設計新的數據類型-------類類型。 一般情況下&#xff0c;基本數據類型的運算都是運算符來表達&#x…

【C++】詳解C++的模板

目錄 概念 ?編輯 語法 函數模板 類模板 非類型模板參數 模板的特化 函數模板特化 類模板特化 全特化 偏特化 分離編譯 概念 模板是C中非常厲害的設計&#xff0c;模板把通用的邏輯剝離出來&#xff0c;讓不同的數據類型可以復用同一種模板的邏輯&#xff0c;甚至可以…

Flutter 中的 DataTable 小部件:全面指南

Flutter 中的 DataTable 小部件&#xff1a;全面指南 在Flutter的Material組件庫中&#xff0c;DataTable是一個用于展示數據的表格組件&#xff0c;它允許開發者以一種結構化和可滾動的方式展示數據集。DataTable非常適合展示詳細信息&#xff0c;如表格數據、統計數據或配置…

PHP黑魔法之md5繞過

php本身是一種弱語言,這個特性決定了它的兩個特點: 輸入的參數都是當作字符串處理變量類型不需要聲明,大部分時候都是通過函數進行類型轉化php中的判斷有兩種: 松散比較:只需要值相同即可,類型不必相同,不通類型比較會先轉化為同類型,比如全數字字符串和數字比較,會比…

凸優化理論學習三|凸優化問題(一)

系列文章目錄 凸優化理論學習一|最優化及凸集的基本概念 凸優化理論學習二|凸函數及其相關概念 文章目錄 系列文章目錄一、優化問題&#xff08;一&#xff09;標準形式的優化問題&#xff08;二&#xff09;可行點和最優點&#xff08;三&#xff09;局部最優點&#xff08;四…

《Python編程從入門到實踐》day28

# 昨日知識點回顧 安裝Matplotlib 繪制簡單的折線圖 # 今日知識點學習 15.2.1 修改標簽文字和線條粗細 # module backend_interagg has no attribute FigureCanvas. Did you mean: FigureCanvasAgg? # 解決辦法&#xff1a;matplotlib切換圖形界面顯示終端TkAgg。 #…

使用Three.js繪制快速而逼真的水

本文將利用GPUComputationRenderer來實現水波紋的繪制&#xff0c;相似的案例可以看threejs官方的GPGPU Water示例。更多精彩內容盡在數字孿生平臺。 什么是 GPGPU GPGPU代表通用圖形處理單元&#xff08;General-Purpose Graphic Processing Unit&#xff09;&#xff0c;意思…

1146 -Table ‘performance schema.session variables‘ doesn‘t exist的錯誤解決

一、問題出現 今天在本地連數據庫的時候&#xff0c;發現這個問題&#xff0c;哎呦我擦&#xff0c;差點嚇死了 二、解決辦法 1&#xff09;找文件 用everything搜一下MySQL Server 5.7 然后去Windows服務找一下MySQL配置文件的具體路徑 如果知道那最好&#xff0c;不知道那…

寶塔8.1.0去除綁定用戶

非要綁定手機號&#xff0c;確實很煩 1&#xff0c;/www/server/panel/BTPanel __init__.py if not public.is_bind():return redirect(/bind, 302) 將is_bind的路由全部注釋 2&#xff0c;/www/server/panel/class下 panelPlugin.py 注釋異常&#xff0c; 新增 softLis…

SSL協議

SSL 安全傳輸協議&#xff08;安全套接層&#xff09; 也叫TLS ---- 傳輸層安全協議 SSL的工作原理&#xff1a;SSL協議因為是基于TCP協議工作的&#xff0c;通信雙方需要先建立TCP會話。因為SSL協議需要進行安全保證&#xff0c;需要協商安全參數&#xff0c;所以也需要建立…

【MySQL】7.MySQL性能優化的六大核心策略

數據庫的性能對整個應用的響應速度和用戶體驗起著至關重要的作用。MySQL&#xff0c;作為廣泛使用的開源關系型數據庫&#xff0c;提供了豐富的性能優化手段。從資源優化、查詢優化到結構、配置、代碼乃至架構優化&#xff0c;每一個層面的調整都可能帶來性能的飛躍。本文將深入…

springboot房屋租賃系統

摘要 房屋租賃系統&#xff1b;為用戶提供了一個房屋租賃系統平臺&#xff0c;方便管理員查看及維護&#xff0c;并且可以通過需求進行設備信息內容的編輯及維護等&#xff1b;對于用戶而言&#xff0c;可以隨時進行查看房屋信息和合同信息&#xff0c;并且可以進行報修、評價…

清理緩存簡單功能實現

在程序開發中&#xff0c;經常會用到緩存&#xff0c;最常用的后端緩存技術有Redis、MongoDB、Memcache等。 而有時候我們希望能夠手動清理緩存&#xff0c;點一下按鈕就把當前Redis的緩存和前端緩存都清空。 功能非常簡單&#xff0c;創建一個控制器類CacheController&#xf…

SpringBoot PowerMockito 私有/靜態/方法/屬性

SpringBoot PowerMockito 私有/靜態/方法/屬性 1 PrepareForTest2 待測試類3 測試類 1 PrepareForTest PrepareForTest 是 PowerMockito 提供的一個注解&#xff0c;用于告訴 PowerMockito 哪些類需要被修改以允許使用 PowerMockito 的功能。 PowerMockito 主要用于修改 Java…

【計算機畢業設計】基于SSM+Vue的線上旅行信息管理系統【源碼+lw+部署文檔+講解】

目錄 1 緒論 1.1 研究背景 1.2 設計原則 1.3 論文組織結構 2 系統關鍵技術 2.1JSP技術 2.2 JAVA技術 2.3 B/S結構 2.4 MYSQL數據庫 3 系統分析 3.1 可行性分析 3.1.1 技術可行性 3.1.2 操作可行性 3.1.3 經濟可行性 3.1.4 法律可行性 3.2系統功能分析 3.2.1管理員功能分析 3.2.…

JavaScript精粹(一)

JavaScript&#xff08;簡稱為JS&#xff09;是一種廣泛應用于網頁開發的腳本語言&#xff0c;具有以下幾個主要作用&#xff1a; 網頁交互&#xff1a;JavaScript 可以用于創建動態的網頁效果&#xff0c;例如響應用戶的操作&#xff0c;實現頁面內容的動態更新&#xff0c;以…