【C++设计模式二】C++工厂模式

2020年11月23日 阅读数:10
这篇文章主要向大家介绍【C++设计模式二】C++工厂模式,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

(1)定义

简单工厂模式中,每新增一个具体产品,就须要修改工厂类内部的判断逻辑。为了避免修改工厂类,遵循开闭原则,工厂方法模式中再也不使用工厂类统一建立全部的具体产品,而是针对不一样的产品设计了不一样的工厂,每个工厂只生产特定的产品。
定义一个用于建立对象的接口,可是让子类决定将哪个类实例化。工厂方法模式让一个类的实例化延迟到其子类。ios

(2)结构

工厂模式结构以下:git

  • 抽象工厂(AbstractFactory):全部生产具体产品的工厂类的基类,提供工厂类的公共方法;
  • 具体工厂(ConcreteFactory):生产具体的产品;
  • 抽象产品(AbstractProduct):全部产品的基类,提供产品类的公共方法;
  • 具体产品(ConcreteProduct):具体的产品类。

(3)实例

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;
}

输出结果:
设计

(4)总结

若是想增长棒球(Baseball)类,只须要增长一个棒球工厂(BaseballFacory),而后在客户端代码中修改具体工厂类的类名,而原有的类的代码无需修改。由此可看到,相较简单工厂模式,工厂方法模式更加符合开闭原则。工厂方法是使用频率最高的设计模式之一,是不少开源框架和API类库的核心模式。code

优势:对象

  • 工厂方法用于建立客户所需产品,同时向客户隐藏某个具体产品类将被实例化的细节,用户只需关心所需产品对应的工厂;
  • 工厂自主决定建立何种产品,而且建立过程封装在具体工厂对象内部,多态性设计是工厂方法模式的关键;
  • 新加入产品时,无需修改原有代码,加强了系统的可扩展性,符合开闭原则。

缺点:blog

  • 添加新产品时,须要同时添加新的产品工厂,系统中类的数量成对增长,增长了系统的复杂度,更多的类须要编译和运行,增长了系统的额外开销;
  • 工厂和产品都引入了抽象层,客户端代码中均使用的抽象层,增长了系统的抽象层次和理解难度。

(z)源码路径

gitee: https://gitee.com/CogenCG/DesignMode接口