工厂模式(Factory Pattern )是最常用的一类创建型设计模式,包含简单工厂模式(Simple Factory Pattern),工厂方法模式(Factory Method Pattern),和抽象工厂模式(Abstract Factory Pattern)。
1,简单工厂介绍
简单工厂模式(Simple Factory Pattern):定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。因为在简单工厂模式中用于创建实例的方法是静态方法,因此简单工厂模式又称为静态工厂方法模式(Static Factory Method Pattern)。
2,简单工厂优缺点
优点:
(1)工厂类含有必要的判断逻辑,可以根据用户的需求动态实例化相关的类,客户端可以免除直接创建产品对象的责任,对客户端来说,去除了与具体产品的依赖。
(2)客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可
缺点:
(1)违背单一职责原则:这个类的职责并不单一,或者说这个类由于要创建不同的对象实例,而每种对象实例的变化都会影响到工厂类(工厂类会修改),所以不只一个原因是这个工厂类改变。
(2)违背开闭原则:如果有一天,需要添加一种新的示例创建方法,而这里我们只能修改工厂中的代码来实现,而开闭原则要求我们,添加新的功能尽量通过添加一个类来实现,而非修改代码。
3,代码示例
抽象产品(Product)角色:是简单工厂所创建的所有对象的父类,提供所有实例有公有的公共接口;
//动物(产品)基类
class Animal
{
public:
Animal();
Animal(string name);
virtual ~Animal();
virtual void Sound();
protected:
string _name;
};
void Animal::Sound()
{
cout <<_name << ":米西米西,滑不拉几" << endl;
}
具体产品(Concrete Product)角色:是简单工厂创建的目标,每一个具体产品都继承于抽象产品,实现抽象产品提供的公共方法。
//具体产品1
class AnimalCat :
public Animal
{
public:
AnimalCat();
AnimalCat(string name);
virtual void Sound();
};
void AnimalCat::Sound()
{
cout << _name << "是一只小猫:喵喵喵" << endl;
}
//具体产品2
#include "Animal.h"
class AnimalDog :
public Animal
{
public:
AnimalDog();
AnimalDog(string name);
virtual void Sound();
};
void AnimalDog::Sound()
{
cout << _name << "是一只小狗:汪汪汪" << endl;
}
工厂(Creator)角色:简单工厂的核心,他负责实现创建所有实例的内部逻辑,可以直接被外界调用创建所需的产品对象,提供的静态方法,返回一个抽象产品类Product,所有具体的产品都是Priduct的子类。
#include "AnimalCat.h"
#include "AnimalDog.h"
//工厂角色
class Factory
{
public:
static Animal* CreateAnimal(string species,string name);
};
Animal* Factory::CreateAnimal(string species,string name)
{
if (species == "dog")
{
return new AnimalDog(name);
}
else if (species == "cat")
{
return new AnimalCat(name);
}
else
{
return new Animal(name);
}
}
调用简单工厂
//检测内存泄漏
#ifdef _DEBUG
#define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__)
#else
#define DEBUG_CLIENTBLOCK
#endif
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#ifdef _DEBUG
#define new DEBUG_CLIENTBLOCK
#endif
//调用
int main()
{
//检测内存泄漏
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
Factory* factory = new Factory;
Animal * dog = factory->CreateAnimal("dog", "贝贝");
dog->Sound();
Animal* cat = factory->CreateAnimal("cat", "花花");
cat->Sound();
Animal* pig = factory->CreateAnimal("pig", "哼哼");
pig->Sound();
delete factory;
factory = NULL;
delete dog;
dog = nullptr;
delete cat;
cat = NULL;
delete pig;
pig = NULL;
return 0;
}