C++ 简单工厂模式 与 工厂模式

news2024/11/19 12:42:03

简单工厂模式:

一个工厂,多个产品。产品需要有一个虚基类。通过传入参数,生成具体产品对象,并利用基类指针指向此对象。通过工厂获取此虚基类指针,通过运行时多态,调用子类实现。

注意:简单工厂 的设计是违反开放封闭原则(对扩展是开放的、对修改是封闭的)的,因为当我门新增一个产品,简单工厂类内部需要修改逻辑以生产对应的产品类。

#include <iostream>
using namespace std;

//操作类型
typedef enum OPERATIONTYPE
{
    OPERATION_ADD,
    OPERATION_SUB,
}OPERATIONTYPE;

//运算符类
class operation
{
public:
    int a;
    int b;
public:
    operation(/* args */){}
    virtual ~operation(){}
public:
    virtual int getResult() = 0;
};

//加法类
class operationAdd : public operation
{
public:
    operationAdd(/* args */){}
    ~operationAdd(){}
public:
     int getResult()
     {
        return a+b;
     }
};

//减法类
class operationSub : public operation
{
public:
    operationSub(/* args */){}
    ~operationSub(){}
public:
    int getResult()
    {
        return a-b;
    }
};

//简单工厂类
class operationFactory
{
public:
    operationFactory(/* args */){}
    ~operationFactory(){}
public:
    operation* createOperation(OPERATIONTYPE type)
    {
        operation *oper;
        switch (type)
        {
        case OPERATION_ADD:
            oper = new operationAdd();
            break;
        case OPERATION_SUB:
            oper = new operationSub();
            break;
        default:
            oper = nullptr;
            break;
        }

        return oper;
    }
};

//客户端
int main()
{
    //创建工厂
    operationFactory opeFactory;

    //通过工厂生产操作类
    operation *opeAdd = opeFactory.createOperation(OPERATION_ADD);
    operation *opeSub = opeFactory.createOperation(OPERATION_SUB);

    opeAdd->a = 1;
    opeAdd->b = 2;
    cout<<"add result: "<<opeAdd->getResult()<<endl;

    opeSub->a = 3;
    opeSub->b = 4;
    cout<<"sub result:" <<opeSub->getResult()<<endl;

    //销毁对象
    delete opeAdd;
    opeAdd = nullptr;

    delete opeSub;
    opeSub = nullptr;

    return 0;
}

工厂模式:

多个工厂,多个产品,每个产品对应于一个工厂。此时工厂和产品都是通过虚基类的方式构建。当增加一个新产品时,同时增加一个新工厂。增加新工厂属于扩展,不会修改以前工厂类和产品类的任何代码。可以看过多个独立的简单工厂模式构成了工厂方法模式,工厂模式是在开放封闭原则的基础上针对简单工厂的升级。

#include <iostream>
using namespace std;

//运算符类
class operation
{
public:
    int a;
    int b;
public:
    operation(/* args */){}
    virtual ~operation(){}
public:
    virtual int getResult() = 0;
};

//加法类
class operationAdd : public operation
{
public:
    operationAdd(/* args */){}
    ~operationAdd(){}
public:
     int getResult()
     {
        return a+b;
     }
};

//减法类
class operationSub : public operation
{
public:
    operationSub(/* args */){}
    ~operationSub(){}
public:
    int getResult()
    {
        return a-b;
    }
};


//工厂基类
class factory
{
public:
    factory(/* args */){}
    virtual ~factory(){}
public:
    virtual operation *createOperation() = 0;
};

//加法工厂类
class addFactory : public factory
{
public:
    addFactory(/* args */){}
    ~addFactory(){}
public:
    operation *createOperation()
    {
        return new operationAdd();
    }
};


//减法工厂类
class subFactory : public factory
{
public:
    subFactory(/* args */){}
    ~subFactory(){}
public:
    operation *createOperation()
    {
        return new operationSub();
    }
};

//客户端
int main()
{
    //创建运算符类工厂
    factory *addFac = new addFactory();
    factory *subFac = new subFactory();

    //通过运算符类工厂生产对应运算符类
    operation *addOpe = addFac->createOperation();    
    operation *subOpe = subFac->createOperation();  

    //使用操作类
    addOpe->a = 1;
    addOpe->b = 2;

    subOpe->a = 3;
    subOpe->b = 4;

    cout<< "add result: " << addOpe->getResult() <<endl;
    cout<< "sub result: " << subOpe->getResult() <<endl; 

    //销毁对象
    delete addOpe;
    addOpe = nullptr;

    delete subOpe;
    subOpe = nullptr;

    delete addFac;
    addFac = nullptr;

    delete subFac;
    subFac = nullptr;
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/135631.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

S32K144—autoMBD是什么?

基于模型的设计&#xff08;Model-Based Design&#xff0c;MBD&#xff09;是一项非常具有发展潜力的技术&#xff0c;autoMBD 致力于分享和传播 MBD 相关技术&#xff0c;让更多人可以快速、高效地在项目开发中使用 MBD。 MBD能做什么&#xff1f; 从大的范围来说&#xff…

14 Python 办公自动化

目录 1、普通文件自动化管理 1.1 文件的复制 1.2 文件内容的复制 1.3 文件的裁剪 1.4 文件的删除 1.5 文件的压缩与解压缩 1.6 文件的查找 1.7 查找含有指定内容的文件 1.8 清理重复的文件 1.9 批量修改目录中的文件名称 2、文件夹的自动化管理 2.1 文件夹的复制 …

机器学习中的数学原理——线性可分问题

这个专栏主要是用来分享一下我在机器学习中的学习笔记及一些感悟&#xff0c;也希望对你的学习有帮助哦&#xff01;感兴趣的小伙伴欢迎私信或者评论区留言&#xff01;这一篇就更新一下《白话机器学习中的数学——线性可分问题》&#xff01; 一、什么是线性可分问题 线性可分…

kibana和elasticsearch-head安装手册

kibana和elasticsearch-head安装手册 0 安装包下载 组件安装包下载地址kibanakibana-8.5.2-linux-x86_64.tar.gzelastic官网&#xff1a;https://www.elastic.co/cn/downloads/past-releases#kibana elastic中文社区&#xff1a;https://elasticsearch.cn/download/nodenode-…

关键字:static

文章目录一、static关键字的使用static修饰属性实例变量静态变量&#xff08;类变量&#xff09;内存解析static修饰方法static注意点如何确定什么时候使用static&#xff1f;方法属性单例设计模式饿汉式懒汉式区分饿汉式和懒汉式一、static关键字的使用 1、可以用来修饰&…

回首满是自豪

写在前面hi朋友&#xff0c;我是几何心凉&#xff0c;感谢你能够点开这篇文章&#xff0c;看到这里我觉得我们是有缘分的&#xff0c;因着这份缘分&#xff0c;我希望你能够看完我的分享&#xff0c;因为下面的分享就是要汇报给你听的&#xff0c;这篇文章是在 2022 年 12 月 3…

【柔性数组与局部性原理】

柔性数组概念 柔性数组特点 局部性原理 柔性数组概念 对于柔性数组&#xff0c;也许你之前从未听说过&#xff0c;柔性数组&#xff0c;顾名思义&#xff0c;就是数组&#xff0c;它的柔性柔在元素个数可以动态变化&#xff0c; 即柔性数组是未知大小的&#xff0c;数组大小…

Elasticsearch:使用 Node.js 将实时数据提取到 Elasticsearch 中(二)

在我的上一篇文章 “Elasticsearch&#xff1a;使用 Node.js 将实时数据提取到 Elasticsearch 中&#xff08;一&#xff09;”&#xff0c;我详细描述了如何如何使用 Node.js 来采集地震数据。在今天的文章中&#xff0c;我们来详细描述如何对数据可视化。我们还将创建一个 we…

推荐七个Python效率工具!让你事半功倍

为了提高效率&#xff0c;我们在平时工作中常会用到一些Python的效率工具&#xff0c;Python作为比较老的编程语言&#xff0c;它可以实现日常工作的各种自动化。为了更便利的开发项目&#xff0c;这里给大家推荐几个Python的效率工具。 1、Pandas-用于数据分析 Pandas是一个强…

UEditorPlus v2.8.0发布 颜色自定义,文档功能完善

UEditor是由百度开发的所见即所得的开源富文本编辑器&#xff0c;基于MIT开源协议&#xff0c;该富文本编辑器帮助不少网站开发者解决富文本编辑器的难点。 UEditorPlus 是有 ModStart 团队基于 UEditor 二次开发的富文本编辑器&#xff0c;主要做了样式的定制&#xff0c;更符…

vim使用教程图文教程(超详细)

1. 三种模式 vim编辑器有三种模式&#xff1a;命令模式、编辑模式、末行模式。 「命令模式」&#xff1a;可以进行删除、复制、粘贴等快捷操作。「编辑模式」&#xff1a;可以编辑文件内容。「末行模式」&#xff1a;可以通过命令操作文件&#xff0c;比如搜索、保存、退出等…

【C语言】字符串小练习(每日小细节012)

前言&#xff1a; 欢迎打开这篇博客&#xff0c;从今天开始&#xff0c;每天和大家分享一个C语言小细节&#xff0c;不久之后还会追加C 一些常常被忽视的小细节和思想统一的编程题目是这个专栏的核心哦 虽然简单但千万别在细节处失分&#xff01;&#xff01;&#xff01;&…

【Linux编辑神器:vim】

目录 1. vim的基本概念 2. vim的基本操作 3. vim正常模式命令集 4. vim底行模式命令集 5. 简单vim配置 6 总结 什么是Vi/Vim? vi/vim的区别简单点来说&#xff0c;它们都是多模式编辑器&#xff0c;不同的是vim是vi的升级版本&#xff0c;它不仅兼容vi的所有指令&#xff0…

【算法】关于双指针的奇技淫巧(一):对撞指针

一、对撞指针 对撞指针由两个指针组成&#xff0c;分别指向数据的头部和尾部&#xff1a; 两个指针分别从两头移动&#xff0c;寻找符合答案的位置后停下。对撞指针主要应用于有序数组的求和&#xff0c;我们使用一个题目进行说明&#xff1a; 示例如下&#xff1a; 根据题目可…

元数据管理Datahub基本介绍和特点

目录1. 基本介绍2. 功能特色2.1 支持不同平台的元数据同步和搜索2.2 血缘关系2.3 查询数据集的统计信息2.4 实时治理2.5 Datahub的权限管理2.6 使用Domains、Glossary Terms、tags对数据Entity进行管理2.7 在Web界面对元数据进行管理1. 基本介绍 Datahub是现代数据栈的元数据管…

TypeScript(一)TypeScript下载安装,编译运行的三种方式:tsc命令行/webpack搭建环境/tsc-node库

什么是TypeScript? TypeScript是拥有类型的JavaScript超集&#xff0c;它可以编译成普通、干净、完整的JavaScript代码。 简单理解&#xff1a;TypeScript就是加强版的JavaScript TypeScript环境搭建 搭建前准备 TypeScript最终会被编译成JavaScript代码&#xff0c;那么我…

JavaSE笔记——函数式编程(类库)

文章目录前言一、基本类型二、重载解析三、FunctionalInterface四、默认方法五、Optional总结前言 前面知道了如何编写 Lambda 表达式&#xff0c;下面将详细阐述另一个重要方面&#xff1a;如何使用 Lambda 表达式。即使不需要编写像 Stream 这样重度使用函数式编程风格的类库…

find_package()的使用

find_package()命令是用来查找依赖包的&#xff0c;理想情况下&#xff0c;一句find_package()把一整个依赖包的头文件包含路径、库路径、库名字、版本号等情况都获取到&#xff0c;后续只管用就好了。但实际中往往CMake失败就是出在find_package()的失败上&#xff08;这里不考…

朝花夕拾 - 2023 莽一年

Hello 2023&#xff0c;我来了~今年&#xff0c;又是一个怎样的楚门世界&#xff0c;我要如何在里面撒泼&#xff0c;期待~一 回收 2022 不及格答卷 回首 2022&#xff0c;那真的不堪回首&#xff0c;细节太多了&#xff0c;没做好没把握住~但是&#xff0c;不管 2022 过得怎样…

Qt6 中如何使用 qsb

【写在前面】 Qt 5 的图形体系结构非常依赖 OpenGL 作为底层 3D 图形 API。但过去 8 年来随着 Metal 和 Vulkan 的推出&#xff0c;市场发生了巨大变化。现在&#xff0c;Qt 6 加入了大量不同平台的图形 API&#xff0c;以确保用户可以在所有平台上以最高性能运行 Qt。 在 Qt Q…