深入浅出设计模式——创建型模式之工厂模式
文章目录
- 工厂方法模式简介
- 工厂方法模式定义
- 工厂方法模式结构
- 工厂方法模式代码实例
-
- 定义抽象产品类AbstractSportProduct,方法不提供实现
- 定义三个具体产品类
- 定义抽象工厂类AbstractFactory,方法为纯虚方法
- 定义三个具体工厂类
- 客户端使用方法示例
- 运行结果
- 工厂方法模式总结
在介绍简单工厂方法模式时Jungle总结出简单工厂模式存在最大的问题是违背了“开闭原则”,每当增加新的产品时,需要修改工厂类的逻辑。为了规避这种不足,同时很好的利用简单工厂模式的优点,本节Jungle将声情并茂地为您奉上工厂方法模式。
为了解决简单工厂模式的这两个弊端,工厂方法模式应运而生,它规定每个产品都有一个专属工厂。比如苹果有专属的苹果工厂,梨子有专属的梨子工厂
工厂方法模式简介
简单工厂模式中,每新增一个具体产品,就需要修改工厂类内部的判断逻辑。为了不修改工厂类,遵循开闭原则,工厂方法模式中不再使用工厂类统一创建所有的具体产品,而是针对不同的产品设计了不同的工厂,每一个工厂只生产特定的产品。
工厂方法模式定义
工厂方法模式:
定义一个用于创建对象的接口,但是让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。
工厂方法模式结构
工厂方法模式代码实例
考虑这样一个场景,如下图:
Jungle想要进行户外运动,它可以选择打篮球、踢足球或者玩排球。和上一次的体育保管室不同,这次分别由篮球保管室、足球保管室和排球保管室.
Jungle只需直接去相应的保管室就可以拿到对应的球!然后Jungle就可以愉快地玩耍了。
定义抽象产品类AbstractSportProduct,方法不提供实现
//抽象产品类AbstractProductclass AbstractSportProduct{public:AbstractSportProduct(){ }virtual ~AbstractSportProduct(){}//抽象方法:virtual void printName() = 0;virtual void play(){} = 0;};
定义三个具体产品类
//具体产品类Basketballclass Basketball :public AbstractSportProduct{public:Basketball(){printName();play();}//具体实现方法void printName(){printf(\"Jungle get Basketball\\n\");}void play(){printf(\"Jungle play Basketball\\n\\n\");}}; //具体产品类Footballclass Football :public AbstractSportProduct{public:Football(){printName();play();}//具体实现方法void printName(){printf(\"Jungle get Football\\n\");}void play(){printf(\"Jungle play Football\\n\\n\");}}; //具体产品类Volleyballclass Volleyball :public AbstractSportProduct{public:Volleyball(){printName();play();}//具体实现方法void printName(){printf(\"Jungle get Volleyball\\n\");}void play(){printf(\"Jungle play Volleyball\\n\\n\");}};
定义抽象工厂类AbstractFactory,方法为纯虚方法
//抽象工厂类class AbstractFactory{public:virtual AbstractSportProduct *getSportProduct() = 0;virtual ~AbstractFactory(){}};
定义三个具体工厂类
/具体工厂类BasketballFactoryclass BasketballFactory :public AbstractFactory{public:BasketballFactory(){printf(\"BasketballFactory\\n\");}AbstractSportProduct *getSportProduct(){printf(\"basketball\");return new Basketball();}}; //具体工厂类FootballFactoryclass FootballFactory :public AbstractFactory{public:FootballFactory(){printf(\"FootballFactory\\n\");}AbstractSportProduct *getSportProduct(){return new Football();}}; //具体工厂类VolleyballFactoryclass VolleyballFactory :public AbstractFactory{public:VolleyballFactory(){printf(\"VolleyballFactory\\n\");}AbstractSportProduct *getSportProduct(){return new Volleyball();}};
客户端使用方法示例
#include #include \"FactoryMethod.h\" int main(){printf(\"工厂方法模式\\n\");//定义工厂类对象和产品类对象AbstractFactory *fac = nullptr;AbstractSportProduct *product = nullptr; fac = new BasketballFactory();product = fac->getSportProduct();delete fac;fac = nullptr;delete product;product = nullptr; fac = new FootballFactory();product = fac->getSportProduct();delete fac;fac = nullptr;delete product;product = nullptr; fac = new VolleyballFactory();product = fac->getSportProduct();delete fac;fac = nullptr;delete product;product = nullptr; system(\"pause\");return 0;}
运行结果
工厂方法模式总结
如果Jungle想玩棒球(Baseball),只需要增加一个棒球工厂(BaseballFacory),然后在客户端代码中修改具体工厂类的类名,而原有的类的代码无需修改。由此可看到,相较简单工厂模式,工厂方法模式更加符合开闭原则。工厂方法是使用频率最高的设计模式之一,是很多开源框架和API类库的核心模式。
之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!