首页 > 其他分享 >设计模式 -- 1:简单工厂模式

设计模式 -- 1:简单工厂模式

时间:2024-03-12 23:29:37浏览次数:23  
标签:std Operate return -- NumsB 工厂 int 设计模式 public

目录

代码记录

设计模式的代码注意要运用到面向对象的思想 考虑到紧耦合和松耦合
把具体的操作类分开 不让其互相影响(注意这点)
下面是UML类图

在这里插入图片描述

代码部分

#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 OperateFactory {
public:
    OperateFactory() {}

    std::unique_ptr<Operate> CreateOperate(char op) {
        switch (op) {
        case '+': return std::make_unique<AddOperate>();
        case '-': return std::make_unique<SubOperate>();
        case '*': return std::make_unique<MulOperate>();
        case '/': return std::make_unique<DivOperate>();
        default:
            throw runtime_error("No such operation!");
        }
    }
};

int main() {
    try {
        OperateFactory factory;
        char op = '/';
        int numA = 100, numB = 700;

        std::unique_ptr<Operate> operate = factory.CreateOperate(op);
        operate->SetNumsA(numA);
        operate->SetNumsB(0);

        cout << operate->GetResult() << endl;
    }
    catch (const exception& e) {
        cout << "Error: " << e.what() << endl;
    }

    return 0;
}

代码参考书:
大话设计模式

标签:std,Operate,return,--,NumsB,工厂,int,设计模式,public
From: https://blog.csdn.net/weixin_52243202/article/details/136665369

相关文章

  • 【数据结构】五分钟自测主干知识(七)
    最近略忙,今天为大家献上数组一节的拓展知识,我们可以从中加深对数组存储对理解,同时温习数组降低存储量的方法,我们会以矩阵存储为典例。主干知识,可以对照黑体字来进行自测~数组基本概念一维数组是纯粹的线性表,数组的元素类型就是线性表的元素类型;二维数组则可以看成“元素......
  • hadoop伪分布式环境搭建
    hadoop伪分布式(1)上传jdk、hadoop、spark安装包(2)解压安装包到指定位置tarzxf安装包.gz-C指定位置(3)重命名mv文件新文件名(4)配置jdk、hadoop、spark环境变量vim/vi/etc/profile(5)加载配置文件source/etc/profile(6)测试java-versionhadoopversions......
  • 做题笔记2024.03
    2024.03.12#1CapitalismCF1450E奇环显然无解有解就直接差分约束就行https://www.luogu.com.cn/record/150592177[2024.03.12#2LEGOndaryGrandmasterCF1615F]不是自己想的/kk看了题解,感觉都说这个转换是显然的,还是太菜考虑将所有偶数位的数先翻转一次,这样原来的操作......
  • 3.11-3.17周报
    寒假训练营2D这道题的题意很简单,有k张技能牌,每张技能牌可以把前\(a_i\)张牌放到最下边,消耗\(b_i\)的花费,现在我们需要的牌在从下往上的第k张,要变到第一张,花费最小的方式。建图的思路就有了,边权就是花费,也就是最短路问题,但是边很灵活,每个点都能建出m条边。点击查看代码voidso......
  • 三月十二号 课堂测试
    今天建民老师留的任务的连接数据库进行添加数据库操作页面代码<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"......
  • 实验1 C语言开发环境使用和数据类型、运算符、表达式
    task1点击查看代码#include<stdio.h>intmain(){printf("o\n"); printf("<H>\n"); printf("II\n"); printf("o\n"); printf("<H>\n"); printf("II\n"); system("......
  • datawhale-动手学数据分析task1笔记
    动手学数据分析task1第一节:数据载入及初步观察载入数据数据集下载导入numpy库和pandas库。importnumpyasnpimportpandasaspd载入数据。相对路径载入数据。df=pd.read_csv('train.csv')绝对路径载入数据。path=os.path.abspath('train.csv')df......
  • angualr - 模块与组件
    模块@NgModule的设计意图静态的元数据(declarations)运行时的元数据(providers)组合与分组(imports和exports)《angular从零到一》说的简单些:NgModule是一个装饰器函数,它接收一个用来描述模块属性的元数据对象。其中最重要的属性是:❑declarations:声明本模块中拥有......
  • 缓冲流+实例(恢复文件顺序)
    1,BufferinputStream-字节`publicclasshelloWorldOutPut{publicstaticvoidmain(String[]args){//1.首先创建字符缓冲输入流与字节缓冲输出流try(BufferedReaderr1=newBufferedReader(newFileReader("D:\\zhaogongzuo\\code\\untitled\\src......
  • .Net 面试题总结
    WPF和WinForm区别WPF:分辨率自适应,属性binding,有事件路由、命令绑定、数据模板数据模板等特性,前后分离,可创建样式动画,页面比WinForm更炫酷WinForm:自适应差,label控件不可设置透明背景区别WPFWinForm句柄整个窗口为一个句柄窗口中每个控件都是一个句柄渲染使......