大话设计模式1-简单工厂

1.需求:设计一个计算器

需要支持加减乘除四种运算

2.普通实现

设计一个Operation类,根据输入的数字和运算符确定执行什么操作

class Operation {
public:
	double GetResult(double numA, double numB, char oper)
	{
		double res = 0.0;
		switch (oper)
		{
			case '+':
				res = numA + numB;
				break;
			case '-':
				res = numA - numB;
				break;
			case '*':
				res = numA * numB;
				break;
			case '/':
				res = numA / numB;
				break;
		}
		return res;
	}
	
};
#include<iostream>
#include"Operation.h"
using namespace std;
int main()
{	
		int numA, numB; char oper;
		Operation  op;
		cout << "请输入数字A" << endl;
		cin >> numA;
		cout << "请选择符号+ - * /" << endl;
		cin >> oper;
		cout << "请输入数字B" << endl;
		cin >> numB;		
		cout << op.GetResult(numA, numB, oper) << endl;
		return 0;	
	}

2.存在问题

普通实现只是实现了业务的封装,如果新增一种运算需要修改switch语句,破坏了开闭原则。不仅如此,我们需要面向对象的设计方法,实现加减运算的分离,从紧耦合变为松耦合。

3.简单工厂

设计一个运算类Operation1,有两个成员函数numA,numB。支持获取和改变两个数的操作,再设计一个虚方法计算结果,虚方法由子类实现。

//Operation1.h
#pragma once
class Operation1 {
public:
	double getnumA() { return numA; }	
	double getnumB() { return numB; }
	void setnumB(double num) 
	{
		numB = num;
	}
	void setnumA(double num)
	{
		numA = num;
	}
	virtual double getRes() 
	{
		double res = 0;
		return res;
	};
private:
	double numA, numB;
};

再设计加减乘除四个类继承运算类

#pragma once
#include "Operation1.h"
class operAdd : public Operation1{
	double getRes()
	{
		double res = 0;
		res = getnumA() + getnumB();
		return res;
	}
};
#pragma once
#include "Operation1.h"
class operSub : public Operation1 {
	double getRes()
	{
		double res = 0;
		res = getnumA() - getnumB();
		return res;
	}
};
#pragma once
#include "Operation1.h"
class operMul : public Operation1 {
	double getRes()
	{
		double res = 0;
		res = getnumA() * getnumB();
		return res;
	}
};
#pragma once
#include "Operation1.h"
class operDiv : public Operation1 {
	double getRes()
	{
		double res = 0;
		res = getnumA() / getnumB();
		return res;
	}
};

我们还可以设计个工厂类,输入运算的符号,工厂就可以实例出合适的对象,通过多态实现加减乘除操作

用一个单独的类做创造实例的过程即工厂

#pragma once
#include "Operation1.h"
#include "operAdd.h"
#include "operMul.h"
#include "operSub.h"
#include "operDiv.h"
class operationFactory {
public:
	Operation1* createOper(char oper)
	{
		Operation1* op = nullptr;
		switch (oper)
		{
		case '+':
			op = new operAdd();
			break;
		case '-':
			op = new operSub();
			break;
		case '*':
			op = new operMul();
			break;
		case '/':
			op = new operDiv();
			break;
		}
		return op;
	}
};

类图如下:
在这里插入图片描述
我们主函数可以如下写:

#include<iostream>
#include"Operation1.h"
#include"operationFactory.h"
using namespace std;
int main()
{	
	Operation1* op;
	operationFactory factory;
	int numA, numB; char oper;
	cout << "请输入数字A:" << endl;
	cin >> numA;
	cout << "请选择符号+ - * /:" << endl;
	cin >> oper;
	cout << "请输入数字B:" << endl;
	cin >> numB;
	op = factory.createOper(oper);
	op->setnumA(numA);
	op->setnumB(numB);
	double res = op->getRes();
	cout << "运算结果:" << endl;
	cout << res<<endl;

	delete op;
	op = nullptr;

	system("pause");
	return 0;
}

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值