引言
在軟件開發中,原型模式是一種常用的設計模式,主要用于創建對象的克隆。通過原型模式,我們可以避免復雜的對象創建過程,尤其是當對象的初始化需要大量資源或復雜操作時。本文將通過一個具體的例子,詳細介紹如何在C++中實現原型模式,并探討其在面向對象設計原則中的應用。
實現步驟
- 定義基類
首先,我們需要定義一個基類YongYong
,它將作為所有具體行為類的父類。基類中包含兩個純虛函數:clone()
和execute()
。
class YongYong {
public:virtual ~YongYong() {}virtual shared_ptr<YongYong> clone() const = 0;virtual void execute() const = 0;
};
clone()
:用于克隆當前對象,返回一個指向新對象的智能指針。execute()
:用于展示具體的行為,每個子類將根據自己的行為實現該方法。
- 創建具體行為類
接下來,我們創建三個具體的行為類,分別繼承自YongYong
,并實現各自的clone()
和execute()
方法。
拿著飯碗吃飯的行為類
class EatYongYong : public YongYong {
public:EatYongYong() {}shared_ptr<YongYong> clone() const override {return make_shared<EatYongYong>(*this);}void execute() const override {cout << "勇勇拿著飯碗在吃飯。" << endl;}
};
打壓下屬的行為類
class PressYongYong : public YongYong {
public:PressYongYong() {}shared_ptr<YongYong> clone() const override {return make_shared<PressYongYong>(*this);}void execute() const override {cout << "勇勇在打壓下屬。" << endl;}
};
欺騙領導的行為類
class DeceiveYongYong : public YongYong {
public:DeceiveYongYong() {}shared_ptr<YongYong> clone() const override {return make_shared<DeceiveYongYong>(*this);}void execute() const override {cout << "勇勇在欺騙領導。" << endl;}
};
- 創建管理類
為了管理不同行為的YongYong
對象,我們創建一個YongYongManager
類。該類使用map
存儲不同行為的原型對象,并提供獲取原型對象的方法。
class YongYongManager {
private:map<string, shared_ptr<YongYong>> prototypes;public:YongYongManager() {prototypes["eat"] = make_shared<EatYongYong>();prototypes["press"] = make_shared<PressYongYong>();prototypes["deceive"] = make_shared<DeceiveYongYong>();}shared_ptr<YongYong> getPrototype(const string& type) const {auto it = prototypes.find(type);if (it != prototypes.end()) {return it->second->clone();}return nullptr;}
};
- 使用管理類創建對象
在main
函數中,我們使用YongYongManager
創建不同行為的YongYong
對象,并調用它們的execute()
方法。
int main() {YongYongManager manager;// 創建吃飯的勇勇shared_ptr<YongYong> yongYong1 = manager.getPrototype("eat");yongYong1->execute();// 創建打壓下屬的勇勇shared_ptr<YongYong> yongYong2 = manager.getPrototype("press");yongYong2->execute();// 創建欺騙領導的勇勇shared_ptr<YongYong> yongYong3 = manager.getPrototype("deceive");yongYong3->execute();return 0;
}
代碼解釋
基類YongYong
- 虛析構函數:確保子類對象能夠正確析構。
- 純虛函數
clone()
:定義克隆方法,子類必須實現。 - 純虛函數
execute()
:定義行為方法,子類必須實現。
具體行為類
每個具體行為類(如EatYongYong
)都繼承自YongYong
,并實現以下方法:
- 構造函數:初始化對象。
clone()
方法:返回自身對象的克隆。execute()
方法:展示具體行為。
管理類YongYongManager
prototypes
:存儲不同行為的原型對象。- 構造函數:初始化原型對象。
getPrototype()
方法:根據類型返回對應的原型對象的克隆。
main
函數
- 創建
YongYongManager
實例。 - 使用
getPrototype()
方法獲取不同行為的YongYong
對象。 - 調用
execute()
方法展示行為。
面向對象設計原則分析
- 單一職責原則(SRP)
- 基類
YongYong
:職責明確,定義克隆和行為方法。 - 具體行為類:每個類只實現一個具體行為。
- 管理類
YongYongManager
:職責單一,管理原型對象。
- 開閉原則(OCP)
- 基類
YongYong
:允許子類擴展行為,無需修改基類。 - 管理類
YongYongManager
:通過添加新的行為類擴展功能,無需修改現有代碼。
- 里氏替換原則(LSP)
- 具體行為類:可以替換基類
YongYong
對象,確保代碼正確性。
- 依賴倒置原則(DIP)
- 管理類
YongYongManager
:依賴于抽象的YongYong
接口,而不是具體實現。
- 接口隔離原則(ISP)
- 基類
YongYong
:定義清晰的接口,無冗余方法。 - 具體行為類:只實現需要的方法。
- 合成復用原則(CRP)
- 管理類
YongYongManager
:通過組合管理對象,而不是通過繼承復用代碼。
總結
通過實現原型模式,我們成功地創建了不同行為的“勇勇”對象,并滿足了多種面向對象設計原則。這種方法不僅提高了代碼的可擴展性和可維護性,還展示了如何通過繼承和接口實現靈活的行為管理。希望本文能夠幫助讀者更好地理解和應用原型模式以及相關的面向對象設計原則。