ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

《大话设计模式》之简单工厂模式

2019-11-17 13:01:07  阅读:216  来源: 互联网

标签:FactoryCalculator double 大话 getResult 工厂 public 设计模式 Calculator rNum


问题背景:

  编程初学者都会有这样的问题,碰到问题就直觉地用计算机能够理解的逻辑来描述待解决的问题以及具体的求解过程,但这样的程序只为满足当前的需求,不容易维护和拓展。

问题解决思路:

  1. 设计一段代码之前,首先需要考虑到其可维护可拓展性
  2. 面向对象特性充分融入到代码设计过程中;

 

calculator.h

#ifndef _CALCULATOR_H_
#define _CALCULATOR_H_
#include <string>

struct Calculator {
	Calculator() = default;
	Calculator(double lNum, double rNum) 
		:leftNumber(lNum), rightNumber(rNum), result(0){}
	~Calculator(){}

	virtual double getResult() = 0; //基类中可实现也可不实现
protected:
	double leftNumber;
	double rightNumber;
	double result;
};

/*
关于继承方式:
	public     -- 属性不变
	protected  -- public变成protected
	private    -- 都变成private
*/
class CalculatorAdd :public Calculator
{
public:
	CalculatorAdd() = default;
	CalculatorAdd(double lNum, double rNum) 
		:Calculator(lNum, rNum){}
	~CalculatorAdd(){};
	//加
	virtual double getResult();
};
class CalculatorSub :public Calculator
{
public:
	CalculatorSub() = default;
	CalculatorSub(double lNum, double rNum) 
		:Calculator(lNum, rNum){}
	~CalculatorSub(){};
	//减
	virtual double getResult();
};
class CalculatorMul :public Calculator
{
public:
	CalculatorMul() = default;
	CalculatorMul(double lNum, double rNum) 
		:Calculator(lNum, rNum){}
	~CalculatorMul(){};
	//乘
	virtual double getResult();
};
class CalculatorDiv :public Calculator
{
public:
	CalculatorDiv() = default;
	CalculatorDiv(double lNum, double rNum)
		:Calculator(lNum, rNum){}
	~CalculatorDiv(){};
	//除
	virtual double getResult();
};

struct FactoryCalculator {
	FactoryCalculator() = default;
	FactoryCalculator(std::string op, double num1, double num2);
	double getResult(){ return p->getResult(); }//简短函数默认inline
private:
	std::string operate;
	double number1;
	double number2;
	Calculator *p;
};

#endif

  calculator.cpp

#include "calculator.h"
#include <iostream>

using namespace std; //通常,using只出现在源文件中,而不出现在头文件中

double Calculator::getResult()
{
	cout << "message print in Calculator::getResult" << endl;
	return 0.0;
}

double CalculatorAdd::getResult()
{
	Calculator::getResult();//我曾经来过

	result = leftNumber + rightNumber;
	return result;
}
double CalculatorSub::getResult()
{
	Calculator::getResult();

	result = leftNumber - rightNumber;
	return result;
}
double CalculatorMul::getResult()
{
	Calculator::getResult();

	result = leftNumber * rightNumber;
	return result;
}
double CalculatorDiv::getResult()
{
	Calculator::getResult();

	if (rightNumber == 0){
		cout << "division cannot be zero" << endl;
		return -1;
	}
	result = leftNumber / rightNumber;
	return result;
}

//如果函数体太长,则初始化列表就写在源文件(初始化列表必须跟函数体)
FactoryCalculator::FactoryCalculator(string op, double num1, double num2) 
	:operate(op), number1(num1), number2(num2)
{
	char flag = operate[0];
	switch (flag)
	{
	case '+':
		p = new CalculatorAdd(number1, number2);
		break;
	case '-':
		p = new CalculatorSub(number1, num2);
		break;
	case '*':
		p = new CalculatorMul(number1, number2);
		break;
	case '/':
		p = new CalculatorDiv(number1, number2);
		break;
	default:
		break;
	}
}

 

main.cpp

#include "calculator.h"
#include <iostream>

using namespace std;

int main()
{
	FactoryCalculator *factoryCalculaotr = new FactoryCalculator("+", 1, 2);
	FactoryCalculator *factoryCalculaotr2 = new FactoryCalculator("-", 1, 2);
	FactoryCalculator *factoryCalculaotr3 = new FactoryCalculator("*", 1, 2);
	FactoryCalculator *factoryCalculaotr4 = new FactoryCalculator("/", 1, 2);
	cout << factoryCalculaotr->getResult() << endl;
	cout << factoryCalculaotr2->getResult() << endl;
	cout << factoryCalculaotr3->getResult() << endl;
	cout << factoryCalculaotr4->getResult() << endl;

	system("pause");
}

  

标签:FactoryCalculator,double,大话,getResult,工厂,public,设计模式,Calculator,rNum
来源: https://www.cnblogs.com/orejia/p/11876000.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有