工厂方法模式学习记录

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;
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值