栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

简单工厂模式

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

简单工厂模式

工厂模式(Factory Pattern )是最常用的一类创建型设计模式,包含简单工厂模式(Simple Factory Pattern),工厂方法模式(Factory Method Pattern),和抽象工厂模式(Abstract Factory Pattern)。

简单工厂模式(Simple Factory Pattern):定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。因为在简单工厂模式中用于创建实例的方法是静态方法,因此简单工厂模式又称为静态工厂方法模式(Static Factory Method Pattern)。

抽象产品(Product)角色:是简单工厂所创建的所有对象的父类,提供所有实例有公有的公共接口;

//动物(产品)基类
class Animal
{
public:
	Animal();
	Animal(string name);
	virtual ~Animal();

	virtual void Sound();

protected:
	string _name;
};


#include "Animal.h"

Animal::Animal()
{}

Animal::Animal(string name)
	:_name(name)
{}

Animal::~Animal()
{}

void Animal::Sound()
{
	cout <<_name << ":米西米西,滑不拉几" << endl;
}

具体产品(Concrete Product)角色:是简单工厂创建的目标,每一个具体产品都继承于抽象产品,实现抽象产品提供的公共方法。

//具体产品1
class AnimalCat :
    public Animal
{
public:
    AnimalCat();
    AnimalCat(string name);
    virtual void Sound();
};

#include "AnimalCat.h"

AnimalCat::AnimalCat()
{}

AnimalCat::AnimalCat(string name)
{
	_name = name;
}

void AnimalCat::Sound()
{
	cout << _name << "是一只小猫:喵喵喵" << endl;
}
//具体产品2
#include "Animal.h"
class AnimalDog :
    public Animal
{
public:
    AnimalDog();
    AnimalDog(string name);
    virtual void Sound();
}; 

#include "AnimalDog.h"

AnimalDog::AnimalDog()
{}

AnimalDog::AnimalDog(string name)
{
	_name = name;
}

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);
	}
}
#include "Factory.h"

#ifdef _DEBUG  
#define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__)  
#else  
#define DEBUG_CLIENTBLOCK  
#endif  
#define _CRTDBG_MAP_ALLOC  
#include   
#include   
#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;
}

优点:
(1)工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅“消费”产品;
(2)客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可
缺点:
(1)违背单一职责原则:这个类的职责并不单一,或者说这个类由于要创建不同的对象实例,而每种对象实例的变化都会影响到工厂类(工厂类会修改),所以不只一个原因是这个工厂类改变。
(2)违背开闭原则:如果有一天,需要添加一种新的示例创建方法,而这里我们只能修改工厂中的代码来实现,而开闭原则要求我们,添加新的功能尽量通过添加一个类来实现,而非修改代码。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/879767.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号