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.设计模 ...
随机推荐
- Oracle数据库巡检
转至:https://blog.51cto.com/sf1314/2123068 select inst_id,status,count(*) from gv$session group by ins ...
- MySQL 学习笔记(二)MVCC 机制
之前在讲 MySQL 事务隔离性提到过,对于写操作给读操作的影响这种情形下发生的脏读.不可重复读.虚读问题.是通过MVCC 机制来进行解决的,那么MVCC到底是如何实现的,其内部原理是怎样的呢?我们要 ...
- Windows用户如何安装cpolar内网穿透
概述 本教程适合于Windows用户,安装并使用cpolar工具. 什么是cpolar? cpolar是一个非常强大的内网穿透工具,开发调试的必备利器 它可以将本地内网服务器的HTTP.HTTPS.T ...
- ajax发送json格式与文件数据、django自带的序列化器(了解)
上期内容回顾 聚合查询和分组查询 # 聚合查询 max min sum avg count # 查询关键字:aggregate from django.db.models import Max, Mi ...
- ASP.NET Core 6框架揭秘实例演示[16]:内存缓存与分布式缓存的使用
.NET提供了两个独立的缓存框架,一个是针对本地内存的缓存,另一个是针对分布式存储的缓存.前者可以在不经过序列化的情况下直接将对象存储在应用程序进程的内存中,后者则需要将对象序列化成字节数组并存储到一 ...
- LeetCode-022-括号生成
括号生成 题目描述:数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合. 示例说明请见LeetCode官网. 来源:力扣(LeetCode) 链接:https ...
- ansible二进制部署kubernetes集群
kubernetes版本1.21.5 需要的资源文件请自行到我的阿里云盘下载 https://www.aliyundrive.com/s/zVegF78ATDV 修改主机信息 #根据自己的主机信息自行 ...
- Docker-生成镜像、服务搭建(redis集群、kibana、运行项目jar包)、上传镜像至阿里云
目录 生成自己的镜像 1.下载官方tomcat镜像 2.运行镜像后将webapp目录里新增文件(官方镜像是没有页面的 具体操作见) 3.使用docker ps -a 查看刚刚修改后的容器id 4.执行 ...
- webgl未使用独立显卡报告
0x00 楔子 最近客户在使用我们的的三维可视化平台的时候,总是会出现浏览器崩溃,webgl context lost的情况. 这种请一般出现在电脑配置很低的电脑上,比如没有独显,只有很小现存的集成显 ...
- Dapr云原生应用开发系列7:工作流集成
题记:这篇介绍一个很有意思的东西,Dapr和Logic Apps这样的工作流引擎集成. Dapr工作流 在1年多前,Dapr的孵化团队搞了一个很有意思的东西:把Dapr和Logic Apps集成起来, ...