設計模式——原型模式(C++)——演算法實現
原型模式
原型模式是用於建立重複的物件,同時又能保證效能。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。
這種模式是實現了一個原型介面,該介面用於建立當前物件的克隆。當直接建立物件的代價比較大時,則採用這種模式。
原型模型其實就是從一個物件再建立另外一個可定製物件,而且不需知道任何建立的細節
意圖: 用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。
主要解決: 在有些系統中,存在大量相同或相似物件的建立問題,如果用傳統的建構函式來建立物件,會比較複雜且耗時耗資源,用原型模式生成物件就很高效,
何時使用:
1、當一個系統應該獨立於它的產品建立,構成和表示時。
2、當要例項化的類是在執行時刻指定時,例如,通過動態裝載。
3、為了避免建立一個與產品類層次平行的工廠類層次時。
4、當一個類的例項只能有幾個不同狀態組合中的一種時。建立相應數目的原型並克隆它們可能比每次用合適的狀態手工例項化該類更方便一些。
如何解決: 利用已有的一個原型物件,快速地生成和原型物件一樣的例項。
關鍵程式碼:
1、實現克隆操作,淺拷貝或通過序列化的方式來實現深拷貝。
2、原型模式同樣用於隔離類物件的使用者和具體型別(易變類)之間的耦合關係,它同樣要求這些"易變類"擁有穩定的介面。
優點:
1、效能提高。
2、逃避建構函式的約束。
缺點:
1、配備克隆方法需要對類的功能進行通盤考慮,這對於全新的類不是很難,但對於已有的類不一定很容易,特別當一個類引用不支援序列化的間接物件,或者引用含有迴圈結構的時候。
2、必須實現 Cloneable 介面。
使用場景:
1、資源優化場景。
2、類初始化需要消化非常多的資源,這個資源包括資料、硬體資源等。
3、效能和安全要求的場景。
4、通過 new 產生一個物件需要非常繁瑣的資料準備或訪問許可權,則可以使用原型模式。
5、一個物件多個修改者的場景。
#include <iostream>
using namespace std;
//原型類
class Prototype
{
public:
string id;
Prototype(string id)
{
this->id = id;
}
virtual Prototype* Clone()=0;
};
//具體原型類
class ConcretePrototypeA:public Prototype
{
public:
ConcretePrototypeA(string id):Prototype(id){};
virtual Prototype* Clone()
{
//淺拷貝:又稱值拷貝,將源物件 的值拷貝到目標拷貝物件中去,本質上來說源物件和目標拷貝物件共用一份實體,只是所引用的變數名不同,地址其實還是相同的。
//舉個簡單的例子:你的小名叫西西,大名叫沫沫,當別人叫你西西或者沫沫的時候你都會答應,這兩個名字雖然不相同,但是都指的是你。
return this;
//深拷貝:每個物件共同擁有自己的資源,必須顯式提供拷貝建構函式和賦值運算子。
//ConcretePrototypeA *tmp = new ConcretePrototypeA(id);
//return tmp;
}
};
int main()
{
ConcretePrototypeA* c1 = new ConcretePrototypeA("Me");
ConcretePrototypeA* c2 = (ConcretePrototypeA*)c1->Clone();
ConcretePrototypeA* c3 = (ConcretePrototypeA*)c1->Clone();
cout<<"Cloned:"<<c2->id<<endl;
cout<<"Cloned:"<<c3->id<<endl;
system("pause");
return 0;
}
理解 C++ 中的深拷貝和淺拷貝:
就比如說,你想複製一間房子。深拷貝指的是你重新買了間房,裡面的佈置也全和原來那間做的一模一樣。這時候你有兩間一模一樣的房子。
淺拷貝指的是你想複製一間房,就去重新配了把鑰匙。你最終還是隻有一間房。只是多了個鑰匙而已
學習來源:《大話設計模式》、《菜鳥教程》
相關文章
- 原型模式的C++實現原型模式C++
- 用Python實現設計模式——建造者模式和原型模式Python設計模式原型
- 設計模式學習-使用go實現原型模式設計模式Go原型
- 設計模式(原型模式)設計模式原型
- 設計模式:原型模式設計模式原型
- 設計模式-原型模式設計模式原型
- 設計模式 —— 原型模式設計模式原型
- Java設計模式-原型模式Java設計模式原型
- Java設計模式---原型模式Java設計模式原型
- 設計模式之原型模式設計模式原型
- 設計模式-原型模式(Prototype)設計模式原型
- 設計模式【5】-- 原型模式設計模式原型
- 設計模式(三)——原型模式設計模式原型
- java設計模式—原型模式Java設計模式原型
- 重學 Java 設計模式:實戰原型模式Java設計模式原型
- 23種設計模式(八)-原型設計模式設計模式原型
- 設計模式之原型設計模式原型
- 設計模式--原型模式(Prototype Pattern)設計模式原型
- go設計模式之原型模式Go設計模式原型
- golang設計模式之原型模式Golang設計模式原型
- 設計模式入門:原型模式設計模式原型
- GoLang設計模式05 - 原型模式Golang設計模式原型
- 極簡設計模式-原型模式設計模式原型
- 設計模式 #3 (原型模式、建造者模式)設計模式原型
- 【設計模式(四)】建立型模式--原型模式設計模式原型
- 設計模式--原型模式及其程式設計思想設計模式原型程式設計
- 23種設計模式-原型模式(3)設計模式原型
- 《設計模式 》 - 4. 原型模式( Prototype )設計模式原型
- 設計模式(Java語言)- 原型模式設計模式Java原型
- Java設計模式之(四)——原型模式Java設計模式原型
- 設計模式快速學習(五)原型模式設計模式原型
- C#設計模式-原型模式(Prototype Pattern)C#設計模式原型
- Rust語言之GoF設計模式:原型模式RustGo設計模式原型
- 設計模式:原型模式介紹 && 原型模式的深拷貝問題設計模式原型
- C++設計模式之Proxy模式(代理模式)C++設計模式
- C++ 設計模式之命令模式C++設計模式
- c/c++設計模式----命令模式C++設計模式
- c/c++設計模式---策略模式C++設計模式