【C++设计模式】简单工厂和工厂方法

#ifndef __FACTORYMETHOD_H__
#define __FACTORYMETHOD_H__

#include <string>

//【说明】
// 工厂类模式通常由工厂类和产品类组成,在工厂类中提供创建创建产品的接口,客户端使用工厂类创建具体的产品。
// 工厂类模式包含简单工厂模式,工厂方法模式和抽象工厂模式。本节介绍简单工厂和工厂方法。

//【定义】
// 简单工厂模式 :专门定义一个工厂类,用来创建不同类型的产品实例。

//【角色】
// 1) 抽象产品(Product):描述具体产品的公共接口。
// 2) 具体产品(ConcreteProduct):工厂类创建的目标类,描述生产的具体产品。
// 3) 具体工厂(ConcreteCreator):定义并实现创建产品的方法,根据产品的类型来创建一个产品实例,由客户调用。

//【意义】
// 不用new关键字来生成实例,而是调用生成实例的专用方法来生成实例,这样就可以防止父类与其他具体类耦合,增加了代码的灵活性。
// 将抽象产品、抽象工厂与具体产品、具体工厂分离开分别形成框架类和具体加工类,可在不修改框架类的前提下,完成其他具有同样接口的产品的创建。
// 简单工厂根据产品类型来创建不同的产品,当增加新的产品时,需要修改工厂类的方法函数。

//【示例】:

class Cmd;

//抽象产品
class iTask
{
public:
	iTask(){ }

	virtual ~iTask(){ }

public:
	virtual void Execute(Cmd * cmd) = 0;
};

//具体产品
class DownloadTask : public iTask
{
public:
	virtual void Execute(Cmd * cmd);
};

//具体产品
class UpgradeTask : public iTask
{
public:	
	virtual void Execute(Cmd * cmd);
};

//具体工厂
class TaskFactory
{
public:
	enum TYPE                         //枚举产品类型
	{
		TASK_DOWNLOADTASK = 0x01,
		TASK_UPGRADETASK  = 0x02,
	};

	iTask* CreateTask(int type);      //创建产品的接口;
};

void TestFactory();

//【说明】
// 简单工厂违背了设计模式里的总原则--对扩展开放,对修改封闭,当增加新的产品时,需要修改工厂创建函数。
// 工厂方法是对简单工厂的扩展,将工厂类的方法声明为接口,具体创建产品延迟到工厂子类中进行,不同产品使用不同的工厂子类创建。

//【定义】
// 工厂方法模式:定义一个用户创建对象的接口,让子类决定实例化哪一个类,工厂方法模式使一个类的实例化延迟到其子类。

//【角色】
// 1) 抽象产品(Product):描述具体产品的公共接口。
// 2) 具体产品(ConcreteProduct):工厂类创建的目标类,描述生产的具体产品。
// 3) 抽象工厂(Creator):声明创建产品的工厂方法接口,返回一个抽象产品。
// 4) 真实工厂(ConcreteCreator):实现抽象工厂的方法,返回一个产品的实例,由客户调用。

//【意义】
// 工厂方法不再使用枚举类型来区分不同产品的创建,而是通过继承由不同的子类来创建不同的产品,工厂方法实现了同类产品的任意扩展。
// 当增加新的产品时,只需要增加新的子类,无需改变之前的代码,达到了对修改关闭,对扩展开放。
// 缺点是当业务中存在大量的具体产品时,会导致具体产品类的数量急剧增加。

//【示例】:

class iTaskFactory
{
public:
	iTaskFactory(){ }

	virtual ~iTaskFactory(){ }

public:
	virtual iTask* CreateTask() = 0;		//工厂方法约定的接口
};

class DownloadTaskFactory : public iTaskFactory
{
public:
	virtual iTask* CreateTask();
};

class UpgradeTaskFactory : public iTaskFactory
{
public:
	virtual iTask* CreateTask();
};

void TestFactoryMethod();


#endif


#include "FactoryMethod.h"

void DownloadTask::Execute(Cmd * cmd)
{
	printf("Execute DownloadTask. \n");
}

void UpgradeTask::Execute(Cmd * cmd)
{
	printf("Execute UpgradeTask. \n");
}

iTask* TaskFactory::CreateTask(int type) 
{
	if(type == TASK_DOWNLOADTASK)
	{
		return new DownloadTask();
	}
	else if(type == TASK_UPGRADETASK)
	{
		return new UpgradeTask();
	}
	else
	{
		return NULL;
	}
}

void TestFactory()
{
	TaskFactory tf;

	iTask *download = tf.CreateTask(TaskFactory::TASK_DOWNLOADTASK);

	download->Execute(NULL);

	delete download;

	iTask *upgrade = tf.CreateTask(TaskFactory::TASK_UPGRADETASK);	

	upgrade->Execute(NULL);

	delete upgrade;
}

iTask* DownloadTaskFactory::CreateTask()
{
	return new DownloadTask();
}

iTask* UpgradeTaskFactory::CreateTask()
{
	return new UpgradeTask();
}

void TestFactoryMethod()
{
	iTaskFactory *downloadfactory = new DownloadTaskFactory();

	iTask *downloadtask = downloadfactory->CreateTask();

	downloadtask->Execute(NULL);

	delete downloadtask;
	delete downloadfactory;

	iTaskFactory *upgradefactory = new UpgradeTaskFactory();

	iTask *upgradetask = upgradefactory->CreateTask();

	upgradetask->Execute(NULL);

	delete upgradetask;
	delete upgradefactory;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值