简单工厂模式学习记录

本文介绍了简单工厂模式,它是创建型设计模式的一种,包括其概念、优缺点和代码实现。简单工厂模式通过静态方法创建对象,降低了客户端与具体产品类的耦合。然而,它也存在违背单一职责原则和开闭原则的问题。示例中展示了如何使用简单工厂模式创建不同类型的动物对象,如猫和狗,并提供了调用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

工厂模式(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;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值