【1】简单工厂模式

一、简单工厂模式

1.封装

体现面向对象的封装的思想

代码如下(示例):

#pragma once

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

// 操作类
class Operation
{
public:
	enum oper{add,sub,mul,div};
	static double getResult(double numberA, double numberB, int operate); // 获取结果
private:
};

#include"operation.h"

double Operation::getResult(double numberA, double numberB, int operate)
{
	double result = 0;

	switch (operate)
	{
	case add:
		result = numberA + numberB;
		break;
	case sub:
		result = numberA - numberB;
		break;
	case mul:
		result = numberA * numberB;
		break;
	case div:
		result = numberA / numberB;
		break;
	default:
		cout << "输入有误" << endl;
		break;
	}
	return result;
}


// 实现一个计算器 加减法
int main()
{
	double numA = 0;
	double numB = 0;
	int operate = 0;
	double result = 0.00;

	while (1)
	{
		cout << "请输入数字A:" << endl;
		cin >> numA;
		cout << "请输入运算符号(+、-、*、/ 对应选项 0 1 2 3):" << endl;
		cin >> operate;
		cout << "请输入数字B:" << endl;
		cin >> numB;

		// 面向对象的封装  将运算和界面分开
		result = Operation::getResult(numA, numB, operate);
     
		cout << "result = " << result << endl;
		cout << endl;
	}

	/*请输入数字A:
	10
	请输入运算符号(+、 - 、 * 、):
	3
	请输入数字B:
	0
	result = inf*/

	system("pause");
	return 0;
}

2.继承、多态、工厂模式

在封装的基础上假如继承、多态、工厂模式,实现更好的面向对象编程
代码如下(示例):

#pragma once

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

// 操作类-----基类
class OPERATION
{
public:
	// OPERATION() {};
	// get
	double get_NumberA() { return m_NumberA; }
	double get_NumberB() { return m_NumberB; }
	// set
	void set_NumberA(double numberA) { m_NumberA = numberA; }
	void set_NumberB(double numberB) { m_NumberB = numberB; }

	// 虚函数
	virtual double getResult() { double result = 0; return result; }; // 获取结果值

private:
	double m_NumberA;
	double m_NumberB;
};

#pragma once
#include"operation.h"

// 加法-----派生类
class OPERATION_ADD : public OPERATION
{
public:
	// OPERATION_ADD() : OPERATION() {};

	double getResult () override
	{
		return (get_NumberA() + get_NumberB());
	}
};

#pragma once
#include"operation.h"

// 减法类-----派生类
class OPERATION_SUB : public OPERATION
{
public:
	double getResult() override
	{
		return (get_NumberA() - get_NumberB());
	}
};

#pragma once
#include"operation.h"

// 乘法类-----派生类
class OPERATION_MUL : public OPERATION
{
public:
	double getResult() override
	{
		return (get_NumberA() * get_NumberB());
	}
};

#pragma once
#include"operation.h"

// 除法类-----派生类
class OPERATION_DIV : public OPERATION
{
public:
	double getResult() noexcept override
	{
		if (get_NumberB() == 0) {
			cout << "零不能做除数" << endl;
			abort(); // 中止程序
		}
		return (get_NumberA() / get_NumberB());
	}
};

#pragma once
#include"operation_Add.h"
#include"operation_Sub.h"
#include"operation_Mul.h"
#include"operation_Div.h"

// 工厂模式类-----确定实例化对象
class OPERATION_FACTORY
{
public:
	// enum oper { add, sub, mul, div };
	// static OPERATION_FACTORY createOperate(int operate)

	static OPERATION* createOperate(char operate,double numA,double numB)
	{
		// 根据不同需求 添加不同的类
		OPERATION* oper = NULL;

		switch (operate)
		{
		case '+':
			oper = new OPERATION_ADD();
			oper->set_NumberA(numA);
			oper->set_NumberB(numB);
			oper->getResult();
			break;
		case '-':
			oper = new OPERATION_SUB();
			oper->set_NumberA(numA);
			oper->set_NumberB(numB);
			oper->getResult();
			break;
		case '*':
			oper = new OPERATION_MUL();
			oper->set_NumberA(numA);
			oper->set_NumberB(numB);
			oper->getResult();
			break;
		case '/':
			oper = new OPERATION_DIV();
			oper->set_NumberA(numA);
			oper->set_NumberB(numB);
			oper->getResult();
			break;
		default:
			cout << "输入有误" << endl;
			break;
		}
		return oper;
	}
};

#include"operation.h"
#include"operation_Factory.h"

// 主函数 实现一个计算器(加减乘除) 利用面向对象思想
int main()
{
	double numA = 0;
	double numB = 0;
	char operate = NULL;
	double result = 0.00;

	while (1)
	{
		cout << "请输入数字A:" << endl;
		cin >> numA;
		cout << "请输入运算符号(+、-、*、/):" << endl;
		cin >> operate;
		cout << "请输入数字B:" << endl;
		cin >> numB;

		// 创建基类对象
		OPERATION* oper;
		// 从工厂中获取所需的派生类
		oper = OPERATION_FACTORY::createOperate(operate, numA, numB);
		// 执行该派生类的多态行为
		double result = oper->getResult();
		
		cout << "result = " << result << endl;
		cout << endl;
	}

	system("pause");
	return 0;
}

总结

提示:这里对文章进行总结:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值