C++设计模式实战(2)——创建型设计模式(2)——工厂方法模式

1.示例:

场景:

代码:

#include <iostream>
#include <string>
using namespace std;

class ExportFileAPI 
{
public:
	virtual bool exportData(string data) = 0;
protected:
	ExportFileAPI(){}
};

//具体化的子类
class ExportTxtFile:public ExportFileAPI
{
public:
	bool exportData(string data)
	{
		cout << "正在导出数据" << data << "到csv文件"<<endl;
		return true;
	}
};

class ExportDB:public ExportFileAPI
{
public:
	bool exportData(string data)
	{
		cout << "正在导出数据" << data << "到数据库" << endl;
		return true;
	}
};

//实现一个ExportOperator的类,这个叫导出数据业务的功能对象
//它也是接口
class ExportOperator
{
public:
	bool exportData(string data)
	{
		ExportFileAPI* pAPI = factoryMethod();
		return pAPI->exportData(data);
	}
protected:
	virtual ExportFileAPI* factoryMethod() = 0;
};

//具体的实现对象完成导出工作
class ExportTxtFileOperator :public ExportOperator
{
protected:
	ExportFileAPI* factoryMethod()
	{
		return new ExportTxtFile();
	}
};

class ExportDBOperator :public ExportOperator
{
protected:
	ExportFileAPI* factoryMethod()
	{
		return new ExportDB();
	}
};

//客户端
int main()
{
	ExportOperator* pOperator = new ExportTxtFileOperator();
	pOperator->exportData("Hello");
	return 0;
}

UML图:

分析:

客户端只知道ExportOperator、ExportTxtFileOperator 、ExportDBOperator 的存在,并且知道exportData方法能够导出数据,但是它不知道factoryMethod方法的存在

2.工厂方法模式

(1)功能

让父类在不知道具体实现的情况下,完成自身的功能调用(如ExportOperator不知道factoryMethod方法的实现,却在它的exportData方法中调用了factoryMethod方法),而具体的实现延迟到了子类来实现。

(2)工厂方法模式中类的实现的说明

实现抽象类:

通常父类是一个抽象类,里面包含创建所需对象的抽象方法,这些抽象方法就是工厂方法

实现具体类:

父类也可以实现为具体类,这种情况下,通常在父类中提供获取所需对象的默认实现方法,这样就算没有具体的类,也能运行

(3)工厂方法的参数和返回值

工厂方法的实现中可能需要参数,以便决定到底采用哪一种具体的实现

一般返回值为被创建对象的接口对象,当然也可以是抽象类或具体类的实例

(4)工厂方法的结构

(5)工厂方法模式与简单工厂的对比

简单工厂:

最大的优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖

工厂方法:

客户端需要决定实例化哪一个工厂来实现ConcreteProduct类,选择的问题还是存在,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行

3.工厂方法模式的工程应用

待STL学完后更新

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值