天天看點

面向對象設計模式學習筆記七Prototype原型模式

為什麼需要原型模式

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

如何應對這種變化?如何向“客戶程式(使用這些對象的程式)”隔離出“這些易變對象”,進而使得“依賴這些易變對象的客戶程式”不随需求改變而改變?

原型模式與工廠模式差別:

原型與工廠都是解決繞開new,來避免對象建立(new)過程 中所導緻的緊耦合(依賴具體類),原型模式的特點在于對象的結構複雜。

什麼是原型模式:

使用原型執行個體指定建立對象的種類,然後通過拷貝(深拷貝)這些原型來建立新的對象。

類圖:

面向對象設計模式學習筆記七Prototype原型模式

執行個體:

//抽象類
class ISplitter{
public:
    virtual void split()=0;
    virtual ISplitter* clone()=0; //通過克隆自己來建立對象
    
    virtual ~ISplitter(){}

};
           
//具體類
class BinarySplitter : public ISplitter{
public:
	BinarySplitter()//自己實作深拷貝構造函數
	{
		
	}

    virtual ISplitter* clone(){
        return new BinarySplitter(*this);//通過拷貝構造函數深克隆
    }
private:
//
};

class TxtSplitter: public ISplitter{
public:
//自己實作深拷貝構造函數
    virtual ISplitter* clone(){
        return new TxtSplitter(*this);
    }
};

class PictureSplitter: public ISplitter{
public:
//自己實作深拷貝構造函數
    virtual ISplitter* clone(){
        return new PictureSplitter(*this);
    }
};

class VideoSplitter: public ISplitter{
public:
//自己實作深拷貝構造函數
    virtual ISplitter* clone(){
        return new VideoSplitter(*this);
    }
};
           
//客戶程式-具體使用
class MainForm : public Form
{
    ISplitter*  prototype;//原型對象

public:
    
    MainForm(ISplitter*  prototype){
        this->prototype=prototype;//這裡必須通過指派使用
    }
    
	void Button1_Click(){

		ISplitter * splitter=//每一次buttonclick後都是建立了一個新的對象
            prototype->clone(); //克隆原型
        
        splitter->split();
        
        

	}
};
           

執行個體代碼:https://blog.csdn.net/qq_29542611/article/details/79521841

繼續閱讀