為什麼需要原型模式
在軟體系統中,經常面臨着某些結構複雜的對象的建立工作;由于需求變化,這些對象經常面臨着劇烈的變化,但是它們卻擁有比較穩定一緻的接口。
如何應對這種變化?如何向“客戶程式(使用這些對象的程式)”隔離出“這些易變對象”,進而使得“依賴這些易變對象的客戶程式”不随需求改變而改變?
原型模式與工廠模式差別:
原型與工廠都是解決繞開new,來避免對象建立(new)過程 中所導緻的緊耦合(依賴具體類),原型模式的特點在于對象的結構複雜。
什麼是原型模式:
使用原型執行個體指定建立對象的種類,然後通過拷貝(深拷貝)這些原型來建立新的對象。
類圖:
執行個體:
//抽象類
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