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

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

简单工厂模式

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

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

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

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

    目前nodejs调用jar主要有两种方式: 通过创建子进程运行java -jar命令调用包含main方法的jar 使用node-java通过c++桥接调用jar 方法一(子进程运行): const { ...

  2. 超好用的Markdown编辑器Typora中的常见语法

    目录 下载网址 安装 一.标题 一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 二.语法环境 三.单选 四.字体 五.分割符 六.列表 七.图片引入 八.表格 九.超链接 下载网址 正版中 ...

  3. 计算机网络实验 Labexercise1-1 Protocol Layers(Wireshark抓包与协议分析实验)

    计算机网络实验 Labexercise1-1 Protocol Layers(Wireshark抓包与协议分析实验) 前言:本博客包含Windows10下安装wget.Wireshark. 一些有用的 ...

  4. KDT入门小讲

    KDT入门小讲 为了搞讲课两天搞出来的PPT,质量不高,随便看看 附:讲课用PPT 链接: https://pan.baidu.com/s/1qHea0fEhscAsQh8-Yu_j_A 提取码: 4 ...

  5. 前端面试题(react)

    React 组件生命周期 在本章节中我们将讨论 React 组件的生命周期. 组件的生命周期可分成三个状态: Mounting:已插入真实 DOM Updating:正在被重新渲染 Unmountin ...

  6. WPF之VisualTreeHelper

     /// <summary>        /// </summary>        /// <typeparam name="T">< ...

  7. 再议 MySQL 回表

    一:回表概述 关于回表的概念网上已经有很多了,这里不过多赘述.下面我们直接放一张图可能更直观说明什么是回表. 图中 非聚集索引也叫二级索引,二级索引本质上也是 一 个 B+ 树结构,与聚集索引(也叫主 ...

  8. Python:用pyinstrument做性能分析

    导引 在计算密集型计算或一些Web应用中,我们常常需要对代码做性能分析.在Python中,最原始的方法即是使用time包中的time函数(该函数以秒为计时单位): from time import s ...

  9. 最长公共子串(DP)

    DP基础_最长公共子串 Description 两个序列的最长公共子串,这个子串要求在序列中是连续的.如:"bab"和"caba" (可以看出来最长公共子串是& ...

  10. 重磅!Vertica集成Apache Hudi指南

    1. 摘要 本文演示了使用外部表集成 Vertica 和 Apache Hudi. 在演示中我们使用 Spark 上的 Apache Hudi 将数据摄取到 S3 中,并使用 Vertica 外部表访 ...