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