簡單工廠模式中,每新增一個具體產品,就須要修改工廠類內部的判斷邏輯。爲了避免修改工廠類,遵循開閉原則,工廠方法模式中再也不使用工廠類統一建立全部的具體產品,而是針對不一樣的產品設計了不一樣的工廠,每個工廠只生產特定的產品。
定義一個用於建立對象的接口,可是讓子類決定將哪個類實例化。工廠方法模式讓一個類的實例化延遲到其子類。ios
工廠模式結構以下:git
Factory.h設計模式
#ifndef FACTORY_H #define FACTORY_H #include <iostream> #include <string> /********************************產品類***********************************/ //抽象產品類AbstractProduct(並不是真正意義上的抽象類,含有純虛函數纔是抽象類) class AbstractSportProduct { public: AbstractSportProduct(){} ~AbstractSportProduct(){} //虛函數 virtual void play(){} }; //具體產品類Basketball class Basketball :public AbstractSportProduct { public: Basketball(){} ~Basketball(){} //具體實現方法 void play(); }; //具體產品類Football class Football :public AbstractSportProduct { public: Football(){} ~Football(){} //具體實現方法 void play(); }; /********************************工廠類***********************************/ //抽象工廠類 class AbstractFactory{ public: //純虛函數 virtual AbstractSportProduct *getSportProduct() = 0; }; //具體工廠類BasketballFactory class BasketballFactory:public AbstractFactory { public: BasketballFactory(){} ~BasketballFactory(){} AbstractSportProduct *getSportProduct(); }; //具體工廠類FootballFactory class FootballFactory:public AbstractFactory { public: FootballFactory(){} ~FootballFactory(){} AbstractSportProduct *getSportProduct(); }; #endif // FACTORY_H
Factory.cpp框架
#include "Factory.h" /********************************產品類方法***********************************/ //Basketball方法 void Basketball::play(){ printf("play Basketball\n"); } //Football方法 void Football::play(){ printf("play Football\n"); } /********************************工廠類方法***********************************/ //BasketballFactory方法 AbstractSportProduct *BasketballFactory::getSportProduct() { return new Basketball(); } //FootballFactory方法 AbstractSportProduct *FootballFactory::getSportProduct() { return new Football(); }
main.cpp函數
#include "Factory.h" int _tmain(int argc, _TCHAR* argv[]) { AbstractSportProduct *pro = nullptr; AbstractFactory *fac = nullptr; fac = new BasketballFactory(); pro = fac->getSportProduct(); pro->play(); fac = new FootballFactory(); pro = fac->getSportProduct(); pro->play(); return 0; }
輸出結果:
設計
若是想增長棒球(Baseball)類,只須要增長一個棒球工廠(BaseballFacory),而後在客戶端代碼中修改具體工廠類的類名,而原有的類的代碼無需修改。由此可看到,相較簡單工廠模式,工廠方法模式更加符合開閉原則。工廠方法是使用頻率最高的設計模式之一,是不少開源框架和API類庫的核心模式。code
優勢:對象
缺點:blog
gitee: https://gitee.com/CogenCG/DesignMode接口