C++ 08工厂方法模式

原创 2015年11月20日 20:23:42

工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。


下面还是举例怎样设计一个计算器。

结构图如下:

请自觉的比较 简单工厂模式和工厂方法模式的异同。


直接上代码:

#include<iostream>
#include<string>

using namespace std;

//抽象运算类
class Operation
{
private:
	double numberA = 0;
	double numberB = 0;
public:
	double getNumberA()
	{
		return numberA;
	}
	void setNumberA(double _numberA)
	{
		numberA = _numberA;
	}
	double getNumberB()
	{
		return numberB;
	}
	void setNumberB(double _numberB)
	{
		numberB = _numberB;
	}

	virtual double getResult() = 0
	{
		double result = 0;
		return result;
	}
};

//加法类
class OperationAdd :public Operation
{
public:
	double getResult()
	{
		double result = 0;
		result = getNumberA() + getNumberB();
		return result;
	}
};

//减法类
class OperationSub :public Operation
{
public:
	double getResult()
	{
		double result = 0;
		result = getNumberA() - getNumberB();
		return result;
	}
};

//乘法类
class OperationMul :public Operation
{
public:
	double getResult()
	{
		double result = 0;
		result = getNumberA() * getNumberB();
		return result;
	}
};

//除法类
class OperationDiv :public Operation
{
public:
	double getResult()
	{
		double result = 0;
		if (this->getNumberB() == 0)
		{
			cout << "除数不能为0" << endl;
			return 0;
		}
		result = getNumberA() / getNumberB();
		return result;
	}
};

//工厂接口类
class IFactory
{
public:
	virtual Operation* createOperation()=0;
};

//加法工厂类
class AddFactory : public IFactory
{
public:
	 Operation* createOperation()
	{
		return new OperationAdd();
	}
};
//减法工厂类
class SubFactory : public IFactory
{
public:
	Operation* createOperation()
	{
		return new OperationSub();
	}
};
//乘法工厂类
class MulFactory : public IFactory
{
public:
	Operation* createOperation()
	{
		return new OperationMul();
	}
};
//除法工厂类
class DivFactory : public IFactory
{
public:
	Operation* createOperation()
	{
		return new OperationDiv();
	}
};


//客户端代码
int main()
{
	IFactory* operFactory = new DivFactory();
	Operation * oper = operFactory->createOperation();
	oper->setNumberA(1);
	oper->setNumberB(2);
	double result = oper->getResult();
	cout << "result="<< result << endl;
}

用工厂方法模式实现的计算器,当再扩展其他新功能时,不需要修改其他原有的代码,只需要扩展新的功能类和具体的工厂类,此模式不像简单方法模式需要修改工厂类中的逻辑判断。

这样整个工厂和产品体系其实都没有修改的变化,而只是扩展的变化,这完全符合了开放-封闭原则的精神。

另外,工厂模式实现时,客户端需要决定实例化哪个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。你想加新功能,本来是修改工厂类的,而现在是要修改客户端。


【C# 设计模式-工厂方法模式】

在上一篇博文【C#设计模式-简单工厂模式】中,我们使用简单工厂模式实现了: 如果有一个住户管理系统,里面的住户类型是可变的,每一种租户类型的租金计算公式都存在差异 例如:A类型的住户租金额=天数*单...
  • heyangyi_19940703
  • heyangyi_19940703
  • 2016年04月19日 11:40
  • 5493

C++:浅谈工厂模式与抽象工厂模式

C++:浅谈工厂模式与抽象工厂模式标签: C++ 工厂模式 抽象工厂模式by 小威威之前写过一篇谈模式的文章:单例模式接下来我将浅显的谈谈工厂模式与抽象工厂模式。工厂模式与抽象工厂模式虽有差异,但实现...
  • linwh8
  • linwh8
  • 2016年04月24日 13:53
  • 1551

【设计模式】简单工厂模式与工厂方法模式详细解读

1.前言     设计模式,各具特色,今天在此总结一下常见模式中 简单工厂模式与工厂方法模式的区别与联系 2.两种模式概要    1. 简单工厂模式         对于简单工厂模式的介绍,请...
  • yudandan10
  • yudandan10
  • 2013年03月10日 15:09
  • 4684

工厂方法模式(设计模式_08)

工厂方法模式遵循了,开放封闭式原则,我们直接用案例来体现:// 定义一个电脑接口 public interface IComputer { // 获取电脑组件的方法 public voi...
  • u011967006
  • u011967006
  • 2016年12月15日 19:02
  • 228

工厂方法模式---重写计算器(C++)

简单工厂模式和工厂模式的区别:        简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态的实例化相关的类,对于客户端来说,除去了与具体产品的依赖。就像计算器,让...
  • u010110208
  • u010110208
  • 2014年01月13日 20:39
  • 801

qt(c++)之 工厂方法模式

转载自:http://blog.csdn.net/liang19890820/article/details/70652858 简述 工厂方法模式(Factory Method Pattern)是一...
  • baidu_33570760
  • baidu_33570760
  • 2017年05月04日 11:49
  • 470

工厂方法模式(factory method)c++版本

参考大话设计模式中的工厂方法模式/* * factory_method.cpp * * Created on: Jul 21, 2017 * Author: clh01s@163....
  • clh01s
  • clh01s
  • 2017年07月21日 14:42
  • 102

学习日记之工厂方法模式和Effective C++

简单工厂模式VS工厂方法模式: 简单工厂模式:最大优点在于工厂类中必须包含必要的逻辑判断,根据客户端选择条件动态实例化相关类,对于客户端来说,去除了与具体产品的依赖。 工厂方法模式(Facto...
  • donglangwudi
  • donglangwudi
  • 2014年07月22日 21:58
  • 823

C++模板实现的通用工厂方法模式

C++模板实现的通用工厂方法模式 1.工厂方法(Factory Method)模式 工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,...
  • gouki04
  • gouki04
  • 2011年11月30日 10:11
  • 5331

C++抽象工厂方法模式

遇到了这样一件事情: 为了调用摄像头及相关功能,有Opencv,QCamera和QML的Camera几种方法。我就随手做了三个类,并分别实现。这样做,每次调用这三个类时,都要看一下每个类中每个方法的...
  • u014597198
  • u014597198
  • 2016年08月25日 12:00
  • 187
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ 08工厂方法模式
举报原因:
原因补充:

(最多只允许输入30个字)