简单工厂模式最直观的一个应用便是实现一个计算器的程序。

比如,公司让你给计算器添加一个幂运算的功能,你只需要设计一个幂运算的类,并实现幂运算的逻辑,然后让该类继承自运算类即可。

简单工厂模式

简单工厂模式的设计特点可以防止设计人员私自更改程序中其他函数方法或其他类成员变量。你只能增加新的类方法,无法对已存在的类进行修改。

比如:老板,让你给公司员工管理程序增加一个考勤计数功能,而你在拿到公司程序源码后偷偷给自己的工资加上一笔,或是在其他功能上做改动,都会造成很严重的后果。而简单工厂模式就可以避免此类事件的发生。

同时,简单工厂模式也存在一个缺点,在增加新的方法类的时候不是可以任意增加的,必须是工厂类中已存在的可以调动的方法,否则,写好的类是没有办法调用的。由于它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。

回归正题,说到计算器,下面就来实现一个复数计算器,同理如果是普通计算器只需要删掉下面的复数类,把运算类的成员变量换成相应的类型(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++ | 简单工厂模式 | 复数计算器的更多相关文章

  1. 简单工厂模式的C++实现

    用简单工厂模式实现一个计算器类: #include <iostream> #include <string> using namespace std; class Operat ...

  2. [Python设计模式] 第1章 计算器——简单工厂模式

    github地址:https://github.com/cheesezh/python_design_patterns 写在前面的话 """ 读书的时候上过<设计模 ...

  3. 学习设计模式第二十七 - GoF之外简单工厂模式

    示例代码来自<深入浅出设计模式>和<大话设计模式> 概述 简单工厂模式又被称为静态工厂模式,属于类的创建型模式.其实质是由一个工厂类根据传入的参量,动态决定应该创建出哪一个产品 ...

  4. Net设计模式实例之简单工厂模式(Simple Factory Pattern)

    一.简单工厂模式简介(Bref Introduction) 简单工厂模式(Simple Factory Pattern)的优点是,工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类, ...

  5. 大话设计模式C++版——简单工厂模式

    简单工厂模式应该是所有设计模式中最简单,也最基础的一种模式,以下是一个简单的采用工厂模式写一个加减法的计算器. 1.抽象接口类——依赖倒转原则(高层和底层都要依赖于抽象,针对接口编程) class I ...

  6. PHP中“简单工厂模式”实例讲解

    原创文章,转载请注明出处:http://www.cnblogs.com/hongfei/archive/2012/07/07/2580776.html 简单工厂模式:①抽象基类:类中定义抽象一些方法, ...

  7. iOS设计模式之简单工厂模式

    简单工厂模式 基本理解 到底要实例化谁,将来会不会增加实例化的对象,比如计算器增加开根运算,这是很容易变化的地方,应该考虑用一个单独的类来做这个创造实例的过程,这就是工厂. 通过使用工厂模式,我们可以 ...

  8. C++实现设计模式之 — 简单工厂模式

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4251756.html 所谓简单工厂模式,是一种实例化对象的方式,只要输入需要实例化对象的名字 ...

  9. C#版--简单工厂模式

    为什么要用设计模式? 1.设计模式是前人根据经验总结出来的,使用设计模式,就相当于是站在了前人的肩膀上. 2.设计模式使程序易读.熟悉设计模式的人应该能够很容易读懂运用设计模式编写的程序. 3.设计模 ...

随机推荐

  1. C++二维动态数组

    //创建 int **a=new int *[n]; for(i=0;i<n;i++) a[i]=new int[n]; // -- // 删除 for(i=0;i<n;i++) dele ...

  2. net core or Linux

    某用户执行net core sdk 版本不生效 sudo chmod +x /home/username/netcore3.1sdk/dotnet //某个用户执行新版本net core sdk

  3. Tableau绘制漏斗图、甘特图、瀑布图、镶边面积图、阴影坡度图

    Tableau绘制漏斗图.甘特图.瀑布图.镶边面积图.阴影坡度图 本文首发于博客冰山一树Sankey,去博客浏览效果更好.直接右上角搜索该标题即可 一. 漏斗图 数据源 1.1 分色直条漏斗图 (1) ...

  4. Nodejs在Linux环境安装

    一.下载安装包 http://nodejs.cn/download/ 二.解压 tar -xf node-v14.3.0-linux-x64.tar.xz 三.配置 1.编辑文件vim /etc/pr ...

  5. OSPF协议原理及配置4-邻接关系的建立和LSDB同步

    OSPF协议原理及配置4-邻接关系的建立和LSDB同步   进入ExStart状态后,广播和NBMA型网络要等待4倍的Hello时间,确定DR和BDR.然后建立邻接关系,并交互链路状态通告,以使用LS ...

  6. Swagger整合Jwt授权配置

    Swagger整合Jwt授权配置 欢迎关注博主公众号「Java大师」, 专注于分享Java领域干货文章http://www.javaman.cn/sb2/swagger-jwt 一.Swagger入门 ...

  7. 常见的Socket网络异常场景分析

    原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介 在目前微服务的背景下,网络异常越来越常见了,而有一些网络异常非常模糊,理解什么情况下会导致什么异常,还是有一定难度 ...

  8. 4月3日 python学习总结

    1. 列表生成器 l=['egg%s' %i for i in range(100) if i>20 ] print(l) 若将 [ ] 换成 ( ),则为生成器表达式,结果是一个迭代器 #求文 ...

  9. bzoj5417/luoguP4770 [NOI2018]你的名字(后缀自动机+线段树合并)

    bzoj5417/luoguP4770 [NOI2018]你的名字(后缀自动机+线段树合并) bzoj Luogu 给出一个字符串 $ S $ 及 $ q $ 次询问,每次询问一个字符串 $ T $ ...

  10. 从文件下载视角来理解Web API

    一.问题源起 从Web From过来的人应该会比较熟悉以下下载文件的代码: [HttpPost] [Route("Download")] public void Download( ...