Prototype 原型模式

原型模式

原型模式即在運行時動態的通過一個對象的實例來創建這個類的對象,可以理解成通過一個實例克隆出另一個實例。

UML類圖

原型模式

原型模式的優點及注意事項

優點

當我們的對象類型不是開始就能確定的,而這個類型是在運行期確定的話,那麼我們通過這個類型的對象克隆出一個新的對象比較容易一些;
有的時候,我們需要一個對象在某個狀態下的副本,此時,我們使用原型模式是最好的選擇;例如:一個對象,經過一段處理之後,其內部的狀態發生了變化;這個時候,我們需要一個這個狀態的副本,如果直接new一個新的對象的話,但是它的狀態是不對的,此時,可以使用原型模式,將原來的對象拷貝一個出來,這個對象就和之前的對象是完全一致的了;
當我們處理一些比較簡單的對象時,並且對象之間的區別很小,可能就幾個屬性不同而已,那麼就可以使用原型模式來完成,省去了創建對象時的麻煩了;
有的時候,創建對象時,構造函數的參數很多,而自己又不完全的知道每個參數的意義,就可以使用原型模式來創建一個新的對象,不必去理會創建的過程,讓創建過程見鬼去吧。

注意事項

在實現時要考慮一些問題:
1. 使用一個原型管理器。當一個系統中原型的數目不固定時,要保持一個可用原型的註冊表。客戶在註冊表中存儲和檢索原型。客戶在克隆一個原型前會在註冊表請求該原型。稱這個註冊表爲原型管理器。
2. 實現克隆操作時要注意深拷貝。
3. 初始化克隆對象時的參數要慎重考慮。

Code

#include <iostream>

class Prototype{
public:
    virtual ~Prototype()=0;
    virtual Prototype* Clone()=0;
    virtual void message()=0;
};


Prototype::~Prototype(){}

class ConcretePrototype:public Prototype{
public:
    ConcretePrototype(){value=0;}
    ConcretePrototype(int val){
        value=val;
    }
    ConcretePrototype(const ConcretePrototype& r){
        std::cout<<"copying"<<std::endl;
        value = r.value;
    }
    virtual void message(){
        std::cout<<value<<std::endl;
    }
    virtual ~ConcretePrototype(){}
    virtual Prototype* Clone(){
        std::cout<<"cloning"<<std::endl;
        return new ConcretePrototype(*this);
    }
private:
    int value;
};

int main()
{
    Prototype* p = new ConcretePrototype(1);
    p->message();
    Prototype* q = p->Clone();
    q->message();
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章