设计模式C++版:第零式简单工厂

2024-03-28 06:48

本文主要是介绍设计模式C++版:第零式简单工厂,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在前面介绍C++基础的时候,我们写了一个简单地计算类 http://blog.csdn.net/thedarkfairytale/article/details/51750971 。考虑到易扩展和复用的特性,下面使用设计模式的简单工厂类实现一下(自己对着代码动手敲一下,感觉绝对不同)

class Operation
{
public:virtual double getresult(){ return 0; }
public:double m_firstnum;double m_secondnum;
};class OperationAdd :public Operation
{
public:double getresult(){ return m_firstnum + m_secondnum; }
};class OperationSub :public Operation
{public:double getresult(){ return m_firstnum - m_secondnum; }
};class OperationMul :public Operation
{public:double  getresult(){ return m_firstnum * m_secondnum; }
};class OperationDiv :public Operation
{
public:double getresult(){if (0 != m_secondnum){return m_firstnum / m_secondnum;}else{printf("the second number can't be zero!");return 0;}}
};
enum class ENUMOPERATION   //枚举类 避免隐式转换的污染
{ADD = 1,SUB = 2,MUL = 3,DIV = 4
};class SimpleFactory
{
public:SimpleFactory():m_oper(nullptr){}Operation &createoperaton(ENUMOPERATION oper);private:Operation * m_oper;
};Operation& SimpleFactory::createoperaton(ENUMOPERATION oper)
{if (m_oper!=nullptr){delete m_oper;m_oper = nullptr;}switch (oper){case ENUMOPERATION::ADD:m_oper = new OperationAdd;break;case ENUMOPERATION::SUB:
m_oper = new OperationSub;break;case ENUMOPERATION::MUL:m_oper = new OperationMul;break;case ENUMOPERATION::DIV:m_oper = new OperationDiv;break;default:m_oper = new OperationAdd;break;}return *m_oper;
}
int main()
{Operation *oper;     SimpleFactory factory;oper = &factory.createoperaton(ENUMOPERATION::ADD);
oper->m_firstnum = 12;oper->m_secondnum = 21;cout << oper->getresult() <<endl;return 0;
}



使用简单工厂模式后的代码,和之前简单的封装以后对比发现,之前的单一接口,都变成了一个运算类,这样的好处是,我们隔离了各种运算,想要复用其中的一个算法不用把其他的也都牵连进来。

如果我们修改加法,则不必和减法产生任何关联,同理修改乘法也不必和除法有什么关联,另外我们添加其他运算方式也方便同时不至于一个类变得太大。如果我们只想使用复用加法和减法,那么我们只需把加减法的运算类拿过来使用即可,不必和乘除法有什么联系。但简单工厂也是很多不足,比如每次添加或减少运算类,都要修改工厂类,在一定程度上降低了工厂类的封装性。

这篇关于设计模式C++版:第零式简单工厂的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/854791

相关文章

SpringBoot简单整合ElasticSearch实践

《SpringBoot简单整合ElasticSearch实践》Elasticsearch支持结构化和非结构化数据检索,通过索引创建和倒排索引文档,提高搜索效率,它基于Lucene封装,分为索引库、类型... 目录一:ElasticSearch支持对结构化和非结构化的数据进行检索二:ES的核心概念Index:

C++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra

C++构造函数中explicit详解

《C++构造函数中explicit详解》explicit关键字用于修饰单参数构造函数或可以看作单参数的构造函数,阻止编译器进行隐式类型转换或拷贝初始化,本文就来介绍explicit的使用,感兴趣的可以... 目录1. 什么是explicit2. 隐式转换的问题3.explicit的使用示例基本用法多参数构造

C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解

《C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解》:本文主要介绍C++,C#,Rust,Go,Java,Python,JavaScript性能对比全面... 目录编程语言性能对比、核心优势与最佳使用场景性能对比表格C++C#RustGoJavapythonjav

C++打印 vector的几种方法小结

《C++打印vector的几种方法小结》本文介绍了C++中遍历vector的几种方法,包括使用迭代器、auto关键字、typedef、计数器以及C++11引入的范围基础循环,具有一定的参考价值,感兴... 目录1. 使用迭代器2. 使用 auto (C++11) / typedef / type alias

GO语言实现串口简单通讯

《GO语言实现串口简单通讯》本文分享了使用Go语言进行串口通讯的实践过程,详细介绍了串口配置、数据发送与接收的代码实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目录背景串口通讯代码代码块分解解析完整代码运行结果背景最近再学习 go 语言,在某宝用5块钱买了个

C++ scoped_ptr 和 unique_ptr对比分析

《C++scoped_ptr和unique_ptr对比分析》本文介绍了C++中的`scoped_ptr`和`unique_ptr`,详细比较了它们的特性、使用场景以及现代C++推荐的使用`uni... 目录1. scoped_ptr基本特性主要特点2. unique_ptr基本用法3. 主要区别对比4. u

C++11中的包装器实战案例

《C++11中的包装器实战案例》本文给大家介绍C++11中的包装器实战案例,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录引言1.std::function1.1.什么是std::function1.2.核心用法1.2.1.包装普通函数1.2.

C++多线程开发环境配置方法

《C++多线程开发环境配置方法》文章详细介绍了如何在Windows上安装MinGW-w64和VSCode,并配置环境变量和编译任务,使用VSCode创建一个C++多线程测试项目,并通过配置tasks.... 目录下载安装 MinGW-w64下载安装VS code创建测试项目配置编译任务创建 tasks.js