【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)源码路径
赞 (0)