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

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

简单工厂模式

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

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

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

回归正题,说到计算器,下面就来实现一个复数计算器,同理如果是普通计算器只需要删掉下面的复数类,把运算类的成员变量换成相应的类型(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. shell脚本读取命令行的参数

    转至:https://www.cnblogs.com/eternityz/p/13879836.html 前提 在编写shell程序时经常需要处理命令行参数 选项与参数: 如下命令行: ./test. ...

  2. 自己创建bmp图像

    随便找一张图片,右键选择打开方式为画图,再在画图中保存为bmp即可 如果要保存为png文件,也可以这样

  3. C#中?和:?和??代表什么

    ?代表可空类型修饰符    引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.为了使值类型也可为空,就可以使用可空类型?:带便三元表达式    int a=b>c?b:c 如果 ...

  4. JAVA Object类方法

    目录 Object类详解 一.==和equals的对比 1.1 ==是一个比较运算符 1.2 equals方法 二.hashCode方法 三.toString方法 四.finalize方法 Objec ...

  5. Thread线程基本写法用法

    //线程属性 protected Thread workerThread; protected bool isWorkerThreadStopped = true; public void Initi ...

  6. 字符集编码(四):UTF

    在前面文章<字符集编码(中):Unicode>中我们聊了 Unicode 标准并提到其有三种实现形式:UTF-16.UTF-8 和 UTF-32,本篇我们就具体聊聊这三种 UTF 是怎么实 ...

  7. 微信小程序 LIn UL的使用

    网址:https://doc.mini.talelin.com/component/form/rate.html 1:将文件解压拉至小程序项目下: 2:网站复制样式代码: 3:复制至需要展示的页面 4 ...

  8. DOS命令基础

    DOS命令 打开CMD win+R,输入cmd. 桌面任何地方按住shift+鼠标右键 ,点击powershell. 我的电脑文件路径前cmd+空格. 开始+系统. 关闭CMD alt+空格+C. 常 ...

  9. 如何在Room框架下注册onUpgrade回调及自定义DatabaseErrorHandler

      在 Android 中,Room 为 SQLite 提供了高效稳定的抽象层,简化开发流程.RoomDatabase.java 是初始化数据库的重要构建组件,通过它我们可以添加RoomDatabas ...

  10. XSHELL的坑

    今天使用XSHELL连接虚拟机上的CENTOS7 ,刚开始还可以正常连接,后来再就连接不上. 检查了半天SSH服务都检查过了运行正常, 重启,检查配置文件. 都OK没问题就是连接不上,折腾半天还是不行 ...