Loading

【C++设计模式一】C++简单工厂模式

(1)定义

定义一个简单工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。

(2)结构

简单工厂模式有以下的结构:

  • 工厂(Factory):根据客户提供的具体产品类的参数,创建具体产品实例;
  • 抽象产品(AbstractProduct):具体产品类的基类,包含创建产品的公共方法;
  • 具体产品(ConcreteProduct):抽象产品的派生类,包含具体产品特有的实现方法,是简单工厂模式的创建目标。

(3)实例

SimpleFactory.h

#ifndef SIMPLEFACTORY_H
#define SIMPLEFACTORY_H
#include <iostream>
#include <string>

//抽象产品类AbstractProduct(并非真正意义上的抽象类,含有纯虚函数才是抽象类)
class AbstractSportProduct
{
public:
	AbstractSportProduct(){}
	~AbstractSportProduct(){}

	//虚函数
	virtual void printName(){}
	virtual void play(){}
};

//具体产品类Basketball
class Basketball :public AbstractSportProduct
{
public:
	Basketball(){}
	~Basketball(){}

	//具体实现方法
	void printName();	
	void play();
};

//具体产品类Football
class Football :public AbstractSportProduct
{
public:
	Football(){}
	~Football(){}

	//具体实现方法
	void printName();
	void play();
};

//工厂类
class Factory
{
public:
	Factory(){}
	~Factory(){}

	AbstractSportProduct *getSportProduct(std::string productName);
};

#endif // TSIMPLEFACTORY_H

SimpleFactory.cpp

#include "SimpleFactory.h"

//Basketball方法
void Basketball::printName(){
	printf("Basketball\n");
}
void Basketball::play(){
	printf("play Basketball\n");
}

//Football方法
void Football::printName(){
	printf("Football\n");
}
void Football::play(){
	printf("play Football\n");
}

//工厂方法
AbstractSportProduct *Factory::getSportProduct(std::string productName)
{
	AbstractSportProduct *pro = NULL;
	if (productName == "Basketball")
	{
		pro = new Basketball();
	}
	else if (productName == "Football")
	{
		pro = new Football();
	}
	return pro;
}

main.cpp

#include "SimpleFactory.h"

int _tmain(int argc, _TCHAR* argv[])
{
	Factory *fac = new Factory();
	AbstractSportProduct *product = NULL;
    
	product = fac->getSportProduct("Basketball");
	product->printName();
	product->play();

	product = fac->getSportProduct("Football");
	product->printName();
	product->play();
    
    return 0;
}

输出结果:

(4)总结

优点:

  • 工厂类提供创建具体产品的方法,并包含一定判断逻辑,客户不必参与产品的创建过程;
  • 客户只需要知道对应产品的参数即可,参数一般简单好记,如数字、字符或者字符串等。

缺点:

  • 在扩展功能时,需要增加具体的产品类和修改工厂类,所以违背了开闭原则(对扩展开放,对修改关闭)。

(z)源码路径

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

posted @ 2020-10-15 10:53  李春港  阅读(258)  评论(0编辑  收藏  举报