C++ | 简单工厂模式 | 复数计算器
简单工厂模式最直观的一个应用便是实现一个计算器的程序。
比如,公司让你给计算器添加一个幂运算的功能,你只需要设计一个幂运算的类,并实现幂运算的逻辑,然后让该类继承自运算类即可。
简单工厂模式:
简单工厂模式的设计特点可以防止设计人员私自更改程序中其他函数方法或其他类成员变量。你只能增加新的类方法,无法对已存在的类进行修改。
比如:老板,让你给公司员工管理程序增加一个考勤计数功能,而你在拿到公司程序源码后偷偷给自己的工资加上一笔,或是在其他功能上做改动,都会造成很严重的后果。而简单工厂模式就可以避免此类事件的发生。
同时,简单工厂模式也存在一个缺点,在增加新的方法类的时候不是可以任意增加的,必须是工厂类中已存在的可以调动的方法,否则,写好的类是没有办法调用的。由于它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。
回归正题,说到计算器,下面就来实现一个复数计算器,同理如果是普通计算器只需要删掉下面的复数类,把运算类的成员变量换成相应的类型(int、double)即可。
#include <iostream>
using namespace std;
class Complex
{
public:
Complex(int real = 0, int imag = 0) :m_real(real), m_imag(imag)
{
}
//"+"重载
Complex operator+(const Complex& c)
{
//实部+实部//虚部+虚部
return Complex(m_real + c.m_real, m_imag + c.m_imag);
}
//"-"重载
Complex operator-(const Complex& c)
{
//实部-实部//虚部-虚部
return Complex(m_real - c.m_real, m_imag - c.m_imag);
}
//"*"重载
Complex operator*(const Complex& c)
{
return Complex(m_real * c.m_real - m_imag * c.m_imag, m_imag * c.m_real + m_real * c.m_imag);
}
//"/"重载
Complex operator/(const Complex& c)
{
/* (a+bi)*(c-di)
* (a+bi)/(c+di) = -------------
** c^2+d^2
*/
Complex cTmp;
double d;
d = c.m_real * c.m_real + c.m_imag * c.m_imag;
if (-0.00000001 < d && d < 0.00000001)
throw exception("除数不能为0");
cTmp.m_real = (m_real * c.m_real - m_imag * (-1) * c.m_imag) / d;
cTmp.m_imag = (m_imag * c.m_real + m_real * (-1) * c.m_imag) / d;
return cTmp;
}
double m_real;
double m_imag;
};
class Operation //定义基类:运算类
{
public:
/*虚函数,实现多态*/
virtual Complex GetResult() = 0;
void SetNumberA(Complex a)
{
numberA = a;
}
Complex GetNumberA()
{
return numberA;
}
void SetNumberB(Complex b)
{
numberB = b;
}
Complex GetNumberB()
{
return numberB;
}
protected:
Complex numberA;
Complex numberB;
};
class OperationAdd : public Operation //加法类:继承运算类
{
public:
virtual Complex GetResult()
{
Complex tmp;
tmp= numberA + numberB;
return tmp;
}
};
class OperationSub : public Operation //减法类:继承运算类
{
public:
virtual Complex GetResult()
{
return numberA - numberB;
}
};
class OperationMul : public Operation //乘法类:继承运算类
{
public:
virtual Complex GetResult()
{
return numberA * numberB;
}
};
class OperationDiv : public Operation //除法类:继承运算类
{
public:
virtual Complex GetResult()
{
return numberA / numberB;
}
};
class OperationFactory //工厂模式:实现对应运算符的实例化
{
public:
OperationFactory()
{
operation = NULL;
}
Operation* CreateOperate(char o)
{
switch (o)
{
case '+':
operation = new OperationAdd();
break;
case '-':
operation = new OperationSub();
break;
case '*':
operation = new OperationMul();
break;
case '/':
operation = new OperationDiv();
break;
default:
throw exception("操作符错误");
}
return operation;
}
~OperationFactory()
{
delete operation;
}
private:
Operation* operation;
};
int main()
{
Complex numberA;
Complex numberB;
char operate;
cout << "输入复数A的实部: ";
cin >> numberA.m_real;
cout << " 虚部: ";
cin >> numberA.m_imag;
cout << "运算符(+ - * /): ";
cin >> operate;
cout << "输入复数B的实部: ";
cin >> numberB.m_real;
cout << " 虚部: ";
cin >> numberB.m_imag;
OperationFactory factory; //实例化运算符后返回基类指针
Operation* operation; //接收实例化后的运算符
try
{
//实例化运算符
operation = factory.CreateOperate(operate);
}
catch (exception & e)
{
cout << e.what() << endl;
exit(1);
}
operation->SetNumberA(numberA);
operation->SetNumberB(numberB);
Complex result;
try
{
result = operation->GetResult();
}
catch (exception & e)
{
cout << e.what() << endl;
exit(1);
}
cout << "计算结果: (" << result.m_real << ", " << result.m_imag << "i)" << endl;
return 0;
}
运行截图:
加法:

减法:

乘法:

除法:

C++ | 简单工厂模式 | 复数计算器的更多相关文章
- 简单工厂模式的C++实现
用简单工厂模式实现一个计算器类: #include <iostream> #include <string> using namespace std; class Operat ...
- [Python设计模式] 第1章 计算器——简单工厂模式
github地址:https://github.com/cheesezh/python_design_patterns 写在前面的话 """ 读书的时候上过<设计模 ...
- 学习设计模式第二十七 - GoF之外简单工厂模式
示例代码来自<深入浅出设计模式>和<大话设计模式> 概述 简单工厂模式又被称为静态工厂模式,属于类的创建型模式.其实质是由一个工厂类根据传入的参量,动态决定应该创建出哪一个产品 ...
- Net设计模式实例之简单工厂模式(Simple Factory Pattern)
一.简单工厂模式简介(Bref Introduction) 简单工厂模式(Simple Factory Pattern)的优点是,工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类, ...
- 大话设计模式C++版——简单工厂模式
简单工厂模式应该是所有设计模式中最简单,也最基础的一种模式,以下是一个简单的采用工厂模式写一个加减法的计算器. 1.抽象接口类——依赖倒转原则(高层和底层都要依赖于抽象,针对接口编程) class I ...
- PHP中“简单工厂模式”实例讲解
原创文章,转载请注明出处:http://www.cnblogs.com/hongfei/archive/2012/07/07/2580776.html 简单工厂模式:①抽象基类:类中定义抽象一些方法, ...
- iOS设计模式之简单工厂模式
简单工厂模式 基本理解 到底要实例化谁,将来会不会增加实例化的对象,比如计算器增加开根运算,这是很容易变化的地方,应该考虑用一个单独的类来做这个创造实例的过程,这就是工厂. 通过使用工厂模式,我们可以 ...
- C++实现设计模式之 — 简单工厂模式
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4251756.html 所谓简单工厂模式,是一种实例化对象的方式,只要输入需要实例化对象的名字 ...
- C#版--简单工厂模式
为什么要用设计模式? 1.设计模式是前人根据经验总结出来的,使用设计模式,就相当于是站在了前人的肩膀上. 2.设计模式使程序易读.熟悉设计模式的人应该能够很容易读懂运用设计模式编写的程序. 3.设计模 ...
随机推荐
- 一个C#程序的执行过程
可能很多人都知道我们把程序打包成dll就丢出去了,但是里面的具体的执行过程是怎么样的呢. 程序集是由元数据和IL组成的.IL是和CPU无关的语言,是微软的几个专家请教了外面的编译器的作则,开发出来的. ...
- Windows server 2008 R2 多用户远程桌面配置详解(超过两个用户)
转至:https://www.jb51.net/article/139542.htm 注意:一下是针对win2008 server r2的操作 1. 创建三个本地管理员测试用户 user01 use ...
- jieba:统计一篇文章中词语数
jieba官方文档 1.jieba分词的四种模式 精确模式.全模式.搜索引擎模式.paddle模式 精确模式:把文本精确的切分开,不存在冗余单词,适合文本分析: 全模式:把文本中所有可能的词语都扫描出 ...
- C#中?和:?和??代表什么
?代表可空类型修饰符 引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.为了使值类型也可为空,就可以使用可空类型?:带便三元表达式 int a=b>c?b:c 如果 ...
- 系统整理qt笔记3
qtcreator中不能输入中文: https://blog.csdn.net/qq_15725099/article/details/97305507 main.cpp #include " ...
- 【行业Tip】两化融合
工业4.0 智能制造规划 两化融合是信息化和工业化的高层次的深度结合, 是指以信息化带动工业化.以工业化促进信息化,走新型工业化道路:两化融合的核心就是信息化支撑,追求可持续发展模式.
- LGP3311题解
为什么我和同学对比了一下,发现我和他的做法差别很大啊 对于这种问题,我们把整个字符串分为两个部分:前缀顶着最高位和后缀没有顶着最高位. 我们枚举这个前缀,然后后缀通过 DP 来搞定. 不包含任何一个子 ...
- Three.js 火焰效果实现艾尔登法环动态logo 🔥
声明:本文涉及图文和模型素材仅用于个人学习.研究和欣赏,请勿二次修改.非法传播.转载.出版.商用.及进行其他获利行为. 背景 <艾尔登法环>是最近比较火的一款游戏,观察可以发现它的 Log ...
- Java基础—字符串的比较
1."=="方法进行比较时有以下两种情况: 基础数据类型:比较的是数据值是否相同 引用类型:比较的是地址值是否相同 字符串是对象,它比较内容是通过一个方法实现的,equals() ...
- Linux移植总结--Linux中asm和arch的软链接
@ 目录 问题 include <asm/aaa.h>实际用的是asm-arm/aaa.h include <asm/arch/memory.h>实际用的是include/as ...