1,工厂方法模式介绍
**
工厂方法模式定义:在工厂模式中,工厂父类负责定义创建产品对象的公告接口,而工厂子类负责生成具体的产品对象。目的是将产品的实例化操作延迟到工厂子类中完成,通过工厂子类来确定究竟应该实例化哪一个具体产品类。**
模式结构----每一个工厂子类负责生产一类具体的产品。
2,工厂模式的优缺点
简单工厂模式中最大的缺点是当有新产品要加入系统时,必须要修改工厂类,加入必要的处理逻辑,违背了“开放封闭原则”,在工厂方法模式中对这点进行了优化。
优点:系统的扩展性好,符合“开放封闭原则” 。当系统加入新产品时,无须修改抽象工厂和抽象产品提供的接口,无须修改客户端,也无须修改其他的具体工厂和具体产品,而只要添加一个具体工厂和具体产品即可。
缺点:在添加新产品时,需要编写新的具体产品类,而且要提供与之对应的具体工厂类,系统中类的个数将成对增加,一定程度上增加了系统的复杂度。
3,代码示例
//产品抽象类
class Animal
{
public:
virtual void Sound();
protected:
string name;
};
//具体产品类1 对Sound进行重写
class Cat :
public Animal
{
public:
Cat();
Cat(string name);
virtual void Sound();
};
void Cat::Sound()
{
std::cout <<name << "---喵喵喵---" << std::endl;
}
//具体产品类2
class Dog :
public Animal
{
public:
Dog();
Dog(string name);
virtual void Sound();
};
void Dog::Sound()
{
std::cout << name << "---旺旺旺---" << std::endl;
}
//抽象工厂类
class AnimalFactory
{
public:
virtual ~AnimalFactory(); //虚析构函数
virtual Animal* CreateAnimal(string name);
private:
// Animal* _animal;
};
//----------------------------生产小猫的工厂--------------------------
class CatAnimalFactory :
public AnimalFactory
{
public:
~CatAnimalFactory();
virtual Animal* CreateAnimal(string name);
private:
Cat *cat;
};
CatAnimalFactory::~CatAnimalFactory()
{
delete cat;
cat = nullptr;
}
//生产小猫
Animal* CatAnimalFactory::CreateAnimal(string name)
{
cat = new Cat(name);
return cat;
}
//----------------------------生产小狗的工厂--------------------------
class DogAnimalFactory :
public AnimalFactory
{
public:
~DogAnimalFactory();
virtual Animal* CreateAnimal(string name);
private:
Dog* dog;
};
DogAnimalFactory::~DogAnimalFactory()
{
delete dog;
dog = nullptr;
}
//生产小狗
Animal* DogAnimalFactory::CreateAnimal(string name)
{
dog = new Dog(name);
return dog;
}
对工厂类进行调用
//检测是否内存泄露代码,在没有养成良好的习惯之前,学会经常检查代码内存泄漏问题
#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);
AnimalFactory* _NewAnimal = new CatAnimalFactory();
Animal* animal = _NewAnimal->CreateAnimal("花花");
animal->Sound();
AnimalFactory *_NewAnimal2 = new DogAnimalFactory;
Animal* animal2 = _NewAnimal2->CreateAnimal("贝贝");
animal2->Sound();
Animal* animal3 = _NewAnimal2->CreateAnimal("小黑");
animal3->Sound();
//要释放,否则会造成内存泄漏
delete _NewAnimal;
_NewAnimal = nullptr;
delete animal;
animal = nullptr;
delete _NewAnimal2;
_NewAnimal2 = nullptr;
delete animal2;
animal2 = nullptr;
delete animal3;
animal3 = nullptr;
return 0;
}