前文回顾
单例模式(一)
单例模式(二)
观察者模式
简单工厂模式
工厂方法模式(一)
前言
对于工厂方法模式,当增加新产品时,也需要对应增加一个工厂类。可以使用模版进行封装,减少代码工作量。
实现举例
- 产品抽象基类
class Animal
{
public:
virtual ~Animal(){}
virtual void show() = 0;
};
- 产品派生类
①.Dog 类
#include "animal.h"
#include <iostream>
using namespace std;
class Dog : public Animal
{
public:
Dog(){};
void show() override
{
cout << "汪汪~"<<endl;
}
static Animal * getDog()
{
return new Dog();
}
};
②.Cat 类
#include "animal.h"
#include <iostream>
using namespace std;
class Cat : public Animal
{
public:
Cat(){}
void show() override
{
cout << "喵~"<<endl;
}
static Animal * getCat()
{
return new Cat();
}
};
- 工厂模版基类
template<typename A>
class AnimalFactoryTemplate
{
public:
AnimalFactoryTemplate(){};
virtual ~AnimalFactoryTemplate() {}
virtual A * CreateAnimal() = 0;
};
- 工厂派生类
#include "animalfactorytemplate.h"
template<typename A,typename T >
class AnimalFactory:public AnimalFactoryTemplate<A>
{
public:
A * CreateAnimal()
{
return new T();
}
};
- 客户端调用
#include "animal.h"
#include "dog.h"
#include "cat.h"
#include "animalfactory.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
AnimalFactory<Animal,Dog> dogfactory;
Animal * dog = dogfactory.CreateAnimal();
dog->show();
AnimalFactory<Animal,Cat> catfactory;
Animal * cat = catfactory.CreateAnimal();
cat->show();
delete dog;
delete cat;
return a.exec();
}