C++设计模式 ==> 工厂模式
2023-09-11 14:14:04 时间
简介
在之前,笔者曾简单介绍过简单工厂模式,我们说过简单工厂模式可以使用工厂类根据需求动态生成子类对象,从而方便了未来对算法进行维护和扩展。而工厂模式相较之于简单工厂模式更为复杂,工厂模式对工厂类进行了详细的子类化,为每一个算法都建立了独立的工厂,这样的优点在于可以在算法扩展的时候避免修改总工厂类,而只要生成相应的子类就可以了,尽可能避免了违背“开闭原则”的情况,但缺点在于这样switch一类的条件判断就必须从原来的工厂类搬到了客户端。下面我们通过一个和当时在简单工厂模式章节一样的计算器算法的例子实现一下工厂模式。
图示
代码实现
////////////////////////////
//
// @Author : PeterZheng
// @FileName : FactoryModeDefine.h
// @Date : 2018-08-13 19:17
//
////////////////////////////
#pragma once
#ifndef FMDINCLUDE
#define FMDINCLUDE
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <windows.h>
#endif
//运算符操作类
class Operation
{
public:
double _numberA = 0;
double _numberB = 0;
double result = 0;
virtual double GetResult() { return 0.0; };
};
//总工厂类
class IFactory
{
public:
virtual Operation* CreateFactory() = 0;
};
//加法操作类
class AddOperation : public Operation
{
virtual double GetResult()
{
return _numberA + _numberB;
}
};
//减法操作类
class SubOperation : public Operation
{
virtual double GetResult()
{
return _numberA - _numberB;
}
};
//乘法操作类
class MulOperation : public Operation
{
virtual double GetResult()
{
return _numberA * _numberB;
}
};
//除法操作类
class DivOperation : public Operation
{
virtual double GetResult()
{
if (_numberB != 0)
return _numberA / _numberB;
else
ExitProcess(0);
}
};
//加法工厂类
class AddOpFactory : public IFactory
{
virtual Operation* CreateFactory()
{
return new AddOperation();
}
};
//减法工厂类
class SubOpFactory : public IFactory
{
virtual Operation* CreateFactory()
{
return new SubOperation();
}
};
//乘法工厂类
class MulOpFactory : public IFactory
{
virtual Operation* CreateFactory()
{
return new MulOperation();
}
};
//除法工厂类
class DivOpFactory : public IFactory
{
virtual Operation* CreateFactory()
{
return new DivOperation();
}
};
////////////////////////////
//
// @Author : PeterZheng
// @FileName : FMDemo.cpp
// @Date : 2018-08-13 19:50
//
////////////////////////////
#include "FactoryModeDefine.h"
int main(void)
{
double _numberA = 0;
double _numberB = 0;
char symbol = '\0';
Operation *op = NULL;
IFactory *ft = NULL;
scanf("%lf %c %lf", &_numberA, &symbol, &_numberB);
switch (symbol)
{
case '+':
ft = new AddOpFactory();
break;
case '-':
ft = new SubOpFactory();
break;
case '*':
ft = new MulOpFactory();
break;
case '/':
ft = new DivOpFactory();
break;
default:
ExitProcess(0);
}
op = ft->CreateFactory();
op->_numberA = _numberA;
op->_numberB = _numberB;
op->result = op->GetResult();
std::cout << op->result << std::endl;
system("pause");
return 0;
}
相关文章
- C++设计模式 ==> 简单工厂模式
- 基于C++简单Windows API的socket编程(阻塞模式)
- 大话设计模式C++版——代理模式
- 托管C++线程锁实现 c++11线程池
- C++设计模式之代理模式
- hook C++
- C++中值传递、指针传递和引用传递的比较详解
- Qt Quick 中 QML 与 C++ 混合编程详解
- c++中MFC消息机制,UI线程和工作线程,模式对话框原理
- C++中使用std::sort自定义排序规则时要注意的崩溃问题
- 《C++ AMP:用Visual C++加速大规模并行计算》——第1章 C++ AMP概述
- 《C++面向对象高效编程(第2版)》——3.14 为参数选择正确的模式
- C++外观模式
- C++简单工厂模式
- C++原型模式
- C++命令模式
- 【C++】 yyyy-MM-dd HH:mm:ss 时间格式 时间戳 全面解读超详细
- C++中的时间与时钟
- 92、【树与二叉树】leetcode ——111. 二叉树的最小深度:层次遍历+先序DFS+后序DFS[子问题分解](C++版本)
- 21、【顺序表】-【2013统考真题】查找序列中的主元素(C++版)