設計模式——原型模式(C++)——演算法實現

溼毒清膠囊發表於2020-11-13
原型模式

原型模式是用於建立重複的物件,同時又能保證效能。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。
這種模式是實現了一個原型介面,該介面用於建立當前物件的克隆。當直接建立物件的代價比較大時,則採用這種模式。
原型模型其實就是從一個物件再建立另外一個可定製物件,而且不需知道任何建立的細節

意圖: 用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。
主要解決: 在有些系統中,存在大量相同或相似物件的建立問題,如果用傳統的建構函式來建立物件,會比較複雜且耗時耗資源,用原型模式生成物件就很高效,
何時使用:

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++ 中的深拷貝和淺拷貝:

就比如說,你想複製一間房子。深拷貝指的是你重新買了間房,裡面的佈置也全和原來那間做的一模一樣。這時候你有兩間一模一樣的房子。
淺拷貝指的是你想複製一間房,就去重新配了把鑰匙。你最終還是隻有一間房。只是多了個鑰匙而已

學習來源:《大話設計模式》、《菜鳥教程

相關文章