当前位置: 首页 > news >正文

设计模式 --4:工厂方法模式

总结 :

个人理解:
工厂方法模式就是在简单工程模式的基础下将工厂类抽象出来。如果不抽象工厂类 ,每一次创建一个新的算法,都要修改原来的工厂类,这不符合 开放–封闭原则
将工厂类给抽象出来,让具体的算法去实现一个工厂 ,然后工厂内部添加算法的具体实现。这样就能不影响原来的类。 比如加法工厂去继承工厂类 ,然后我们直接去调用加法工厂然后创建相关的操作。

定义工厂方法模式

定义一个用于创建对象的接口。让子类决定实例化那一个类。工厂方法是一个类的实例化延迟到其子类
在这里插入图片描述

原来的简单工厂模式就可以写成下面的架构:
在这里插入图片描述
以后修改代码的时候 也不用去修改原来的工厂类 而是直接去声明其子类(具体的工厂) 新的添加不会影响其他的子类
修改后的代码

#include <iostream>  
#include <memory> // 引入智能指针的头文件  using namespace std;// 操作基类  
class Operate {
public:Operate() {}virtual ~Operate() {}virtual int GetResult() = 0; // 纯虚函数,强制派生类实现  void  SetNumsA(int A){NumsA = A;}void SetNumsB(int B){NumsB = B;}
protected:int NumsA, NumsB;
};// 加法操作类  
class AddOperate : public Operate {
public:int GetResult() override {return NumsA + NumsB;}
};// 减法操作类  
class SubOperate : public Operate {
public:int GetResult() override {return NumsA - NumsB;}
};// 乘法操作类  
class MulOperate : public Operate {
public:int GetResult() override {return NumsA * NumsB;}
};// 除法操作类  
class DivOperate : public Operate {
public:int GetResult() override {if (NumsB == 0) {throw runtime_error("Division by zero is not allowed.");}return NumsA / NumsB;}
};
//工厂基类
class IFactory {
public:virtual std::unique_ptr<Operate> CreateOperation() = 0;
};
//加法工厂类
class AddFactory : public IFactory
{
public:std::unique_ptr<Operate> CreateOperation() override {return std::make_unique<AddOperate>();}
};
//减法工厂类
class SubFactory : public IFactory
{
public:std::unique_ptr<Operate> CreateOperation() override {return std::make_unique<SubOperate>();}
};
//乘法工厂类
class MulFactory : public IFactory
{
public:std::unique_ptr<Operate> CreateOperation() override {return std::make_unique<MulOperate>();}
};
//除法工厂类
class DivFactory : public IFactory
{
public:std::unique_ptr<Operate> CreateOperation() override {return std::make_unique<DivOperate>();}
};int main() {try {AddFactory factory;std::unique_ptr<Operate> operate = factory.CreateOperation();operate->SetNumsA(100);operate->SetNumsB(200);cout << operate->GetResult() << endl;}catch (const exception& e) {cout << "Error: " << e.what() << endl;}return 0;
}
http://www.lryc.cn/news/325691.html

相关文章:

  • Linux系统centos7.6更换yum源以及下载安装包到指定目录
  • 蓝桥杯-子矩阵
  • Nginx 故障排查之斜杠(/) --(附 Nginx 常用命令)
  • 【超全详解一文搞懂】Scala基础
  • 16:00面试,16:06就出来了,问的问题有点变态。。。
  • 【CTFshow 】web 通关 1.0
  • babel起手式
  • AI大模型在医疗领域的应用案例:自然语言处理与医疗文本分析
  • c语言常见错误
  • 分别使用TCP/UDP实现互相实时发送消息,接收消息功能
  • 使用阿里CICD流水线打包Vue项目到阿里的docker镜像私仓,并自动部署到服务器启动服务
  • 第十三届蓝桥杯物联网试题(省赛)
  • 将谷歌 Gemma AI大模型 部署安装本地教程(可离线使用)
  • ChatGPT提示词大全:解锁AI对话
  • rust中字符串String常用方法和注意事项
  • C语言:自定义类型(结构体)
  • 唯众物联网安装调试员实训平台物联网一体化教学实训室项目交付山东技师学院
  • SqlServer期末复习(数据库原理及应用)持续更新中
  • 合辑下载 | MatrixOne 与 MySQL 全面对比
  • Ubuntu 22.04安装Python3.10.13
  • 2.4 如何运行Python程序
  • Vue中如何实现动态改变字体大小
  • Spring实例化Bean的三种方式
  • AI研报:从Sora看多模态大模型发展
  • Unity访问安卓(Android)或苹果(iOS)相册
  • 用webpack 构建自己的vue-cli
  • ZCC6982最大充电电流 2A、升压型 2 节锂电池充电管理器
  • 【机器学习】无监督学习算法之:K均值聚类
  • 为wordpress特定分类目录下的内容添加自定义字段
  • javaWeb在线考试系统