前言
当客户端只是进行对象的使用,并不关心对象的构造过程,即:提出要什么对象、然后返回对应结果,并不关心这个对象怎么来的,此时即可采用简单工厂模式。
可以模仿 C# 中的反射机制,根据类型名称调用相应方法得到对象实例。
实现举例
- 抽象基类
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();
}
};
- 实现工厂类
#include "dog.h"
#include "cat.h"
#include <functional>
#include <map>
using namespace std;
class AnimalFactory
{
public:
enum AnimalType{dog,cat};
typedef function<Animal*()> Func;
AnimalFactory()
{
//产品注册
AnimalRegistry[dog] = Dog::getDog;
AnimalRegistry[cat] = Cat::getCat;
}
Animal * CreateAnimal(AnimalType type)
{
return AnimalRegistry[type]();
}
private:
map<AnimalType,Func> AnimalRegistry;
};
- 工厂调用
#include "animalfactory.h"
#include "animal.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
AnimalFactory * factory = new AnimalFactory();
Animal * dog = factory->CreateAnimal(AnimalFactory::dog);
Animal * cat = factory->CreateAnimal(AnimalFactory::cat);
dog->show();
cat->show();
delete dog;
delete cat;
return a.exec();
}