工厂方法模式_1天1个设计模式——工厂方法模式
生活随笔
收集整理的這篇文章主要介紹了
工厂方法模式_1天1个设计模式——工厂方法模式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
意圖
工廠方法模式是一種創建型設計模式, 其在父類中提供一個創建對象的方法, 允許子類決定實例化對象的類型。
問題
假設你正在開發一款物流管理應用。1.0版本只能支持處理卡車運輸,因此大部分的代碼都位于名為Truck的類中。隨著業務越來越廣泛,該應用需要支持處理輪船運輸。但是,由于大部分的代碼都在Truck類中,那么添加Ship類則需要修改全部代碼。
更糟糕的是,每添加一種新的運輸方式,就需要對代碼進行一次大規模的修改。心力憔悴啊。
解決方案
工廠方法模式建議使用特殊的工廠方法代替對于對象構造函數的直接調用 (即使用 new運算符)。*(對象仍將通過 new運算符創建, 只是該運算符改在工廠方法中調用罷了。 )*工廠方法返回的對象通常被稱作 “產品”。
我們通過在子類中重寫工廠方法,來改變返回產品的類型。但是,只有當產品具有共同的接口時,子類才能返回不同類型的產品,且基類中的工廠方法還將返回類型聲明為這一共有接口。
利用工廠方法,對問題提出解決方案,類圖如下:
工廠方法模式結構
- Product:所有產品的共有接口。
- Concrete Products:具體產品,對Product接口的不同實現
- Creator:創建者聲明了返回產品對象的工廠方法。 該方法的返回對象類型必須與Product接口相匹配。注意,創建者類包含一些與產品相關的核心業務邏輯。
- Concrete Creators:將會重寫基類工廠方法, 使其返回不同類型的具體產品。
對問題的代碼實現
#includeusing namespace std;// 產品接口中將聲明所有具體產品都必須實現的操作。class Transport {public:~Transport(){}virtual void delivery() const = 0;//不同具體產品對此進行不同實現};// 具體產品需提供產品接口的各種實現。class Truck : public Transport{public:virtual void delivery() const{cout << "卡車:通過盒子運輸" << endl;}};class Ship : public Transport {public:virtual void delivery() const{cout << "輪船:通過集裝箱運輸" << endl;}};// 創建者類聲明的工廠方法必須返回一個產品類的對象。創建者的子類通常會提供// 該方法的實現。class Logistics {public:~Logistics(){}//基類工廠方法,返回類型聲明為產品共有接口virtual Transport* createTransport() const = 0;// 請注意,創建者的主要職責并非是創建產品。其中通常會包含一些核心業務// 邏輯,這些邏輯依賴于由工廠方法返回的產品對象。子類可通過重寫工廠方// 法并使其返回不同類型的產品來間接修改業務邏輯。void plan_delivery() const{//調用工廠方法創建一個產品對象Transport* tran = createTransport();//使用產品tran->delivery();delete tran;}};// 具體創建者將重寫工廠方法以改變其所返回的產品類型。class RoadLogistics :public Logistics {public:virtual Transport* createTransport() const{return new Truck();}};class SeaLogistics :public Logistics {public:virtual Transport* createTransport() const {return new Ship();}};//客戶端代碼void ClientCode(const Logistics* log) {cout << "開始運輸:";log->plan_delivery();}int main() {cout << "APP:以卡車運輸" << endl;Logistics* log1 = new RoadLogistics();ClientCode(log1);cout << endl;cout << "APP:以輪船運輸" << endl;Logistics* log2 = new SeaLogistics();ClientCode(log2);delete log1;delete log2;return 0;}該模式的優缺點
優點
- 避免創建者和具體產品之間的緊耦合
- 符合單一職責原則。將產品創建代碼放在程序的單一位置,從而使代碼易于維護
- 符合開閉原則。無需更改現有客戶端代碼,就可以在程序中引入新的產品類型
缺點
- 工廠方法模式需要引入許多新的子類, 代碼可能會因此變得更復雜。 最好的情況是將該模式引入創建者類的現有層次結構中。
總結
以上是生活随笔為你收集整理的工厂方法模式_1天1个设计模式——工厂方法模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gtest测试框架使用详解_测试框架Te
- 下一篇: 揭开.NET 2.0配置之谜(一)