简单工厂模式中,每新增一个具体产品,就需要修改工厂类内部的判断逻辑。为了不修改工厂类,遵循开闭原则,工厂方法模式中不再使用工厂类统一创建所有的具体产品,而是针对不同的产品设计了不同的工厂,每一个工厂只生产特定的产品。 定义一个用于创建对象的接口,但是让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。
工厂模式结构如下:
Factory.h
#ifndef FACTORY_H#define FACTORY_H#include <iostream>#include <string>/********************************产品类***********************************///抽象产品类AbstractProduct(并非真正意义上的抽象类,含有纯虚函数才是抽象类)class AbstractSportProduct{public: AbstractSportProduct(){} ~AbstractSportProduct(){} //虚函数 virtual void play(){}};//具体产品类Basketballclass Basketball :public AbstractSportProduct{public: Basketball(){} ~Basketball(){} //具体实现方法 void play();};//具体产品类Footballclass Football :public AbstractSportProduct{public: Football(){} ~Football(){} //具体实现方法 void play();};/********************************工厂类***********************************///抽象工厂类class AbstractFactory{public: //纯虚函数 virtual AbstractSportProduct *getSportProduct() = 0;};//具体工厂类BasketballFactoryclass BasketballFactory:public AbstractFactory{public: BasketballFactory(){} ~BasketballFactory(){} AbstractSportProduct *getSportProduct();};//具体工厂类FootballFactoryclass FootballFactory:public AbstractFactory {public: FootballFactory(){} ~FootballFactory(){} AbstractSportProduct *getSportProduct();};#endif // 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
Basketball(){}
~Basketball(){}
//具体实现方法
void play();
//具体产品类Football
class Football :public AbstractSportProduct
Football(){}
~Football(){}
/********************************工厂类***********************************/
//抽象工厂类
class AbstractFactory{
//纯虚函数
virtual AbstractSportProduct *getSportProduct() = 0;
//具体工厂类BasketballFactory
class BasketballFactory:public AbstractFactory
BasketballFactory(){}
~BasketballFactory(){}
AbstractSportProduct *getSportProduct();
//具体工厂类FootballFactory
class FootballFactory:public AbstractFactory
FootballFactory(){}
~FootballFactory(){}
#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();}
#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;}
int _tmain(int argc, _TCHAR* argv[])
AbstractSportProduct *pro = nullptr;
AbstractFactory *fac = nullptr;
fac = new BasketballFactory();
pro = fac->getSportProduct();
pro->play();
fac = new FootballFactory();
return 0;
输出结果:
如果想增加棒球(Baseball)类,只需要增加一个棒球工厂(BaseballFacory),然后在客户端代码中修改具体工厂类的类名,而原有的类的代码无需修改。由此可看到,相较简单工厂模式,工厂方法模式更加符合开闭原则。工厂方法是使用频率最高的设计模式之一,是很多开源框架和API类库的核心模式。
优点:
缺点:
gitee: https://gitee.com/CogenCG/DesignMode
原文链接:http://www.cnblogs.com/lcgbk/p/13819350.html
本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728