C++工厂类和单例模式的结合使用

2023-11-10

单例模式:
简单来说一个类只有一个实例且封装性好。这里用宏定义实现。

animal_singleton.h

#pragma once
#include <iostream>

#define IMPLEMENTION_SINGLETON_CLASS( Type ) \
public:                                      \
    static Type* GetInstance()               \
    {                                        \
        static Type oInstance;               \
        return &oInstance;                   \
    }                                        \
private:                                     \
    Type( const Type& )                      \
    {                                        \
    }                                        \
                                             \
    Type& operator= ( const Type& )          \
    {                                        \
        return *this;                        \
    }

工厂模式:
简单来说,工厂模式减少文件之间的依赖关系,一是可以优化编译,即实现部分改变了而客户不需要重新编译自己的文件;二是实现开放和封闭原则,有利于维护和扩展。
一个animal的例子,animal作为一个接口,由cat和dog来实现,并用factory对cat和dog进行封装,客户端只要有animal接口和factory头文件即可实现cat和dog的具体内容,实现了分离并且有利于维护。

animal_interface.h

#pragma once
#include <iostream>

namespace FactoryAndInstance
{
    class animalIF
    {
    public:
        animalIF(void)
        {

        }
        virtual ~animalIF(void)
        {

        }

        virtual void LikeEat() = 0;
    };
}

animal_cat.h

#pragma onece

#include "animal_singleton.h"
#include "animal_interface.h"

namespace FactoryAndInstance
{
    class CCat:public animalIF
    {
        IMPLEMENTION_SINGLETON_CLASS(CCat);
    public:
        CCat();
        ~CCat();

        void LikeEat();
    };
}

animal_cat.cpp

#include "animal_cat.h"
#include <iostream>
using namespace std;

namespace FactoryAndInstance
{
    CCat::CCat()
    {

    }

    CCat::~CCat()
    {

    }

    void CCat::LikeEat()
    {
        cout<<"cat like eating fish"<<endl;
    }
}

animal_dog.h

#pragma onece

#include "animal_singleton.h"
#include "animal_interface.h"

namespace FactoryAndInstance
{
    class CDog:public animalIF
    {
        IMPLEMENTION_SINGLETON_CLASS(CDog);
    public:
        CDog();
        ~CDog();

    public:
        void LikeEat();
    };
}

animal_dog.cpp

#include "animal_dog.h"
#include <iostream>
using namespace std;

namespace FactoryAndInstance
{
    CDog::CDog()
    {

    }

    CDog::~CDog()
    {

    }

    void CDog::LikeEat()
    {
        cout<<"dog like eating meat"<<endl;
    }
}

animal_factory.h

#pragma once
#include "animal_singleton.h"

namespace FactoryAndInstance
{
    class animalIF;

    class CAnimalFactory
    {
        IMPLEMENTION_SINGLETON_CLASS(CAnimalFactory);

    private:
        CAnimalFactory()
        {

        }

    public:
        ~CAnimalFactory()
        {

        }

        animalIF* GetCatInstance();
        animalIF* GetDogInstance();
    };
}

animal_factory.cpp

#include "animal_factory.h"
#include "animal_cat.h"
#include "animal_dog.h"

namespace FactoryAndInstance
{
    animalIF* CAnimalFactory::GetCatInstance()
    {
        return CCat::GetInstance();
    }
    animalIF* CAnimalFactory::GetDogInstance()
    {
        return CDog::GetInstance();
    }
}

客户实现部分:
main

#include <iostream>
#include "animal_factory.h"
#include "string"
#include "animal_interface.h"

using namespace std;

using namespace FactoryAndInstance;
int main() 
{
    animalIF* pCat = CAnimalFactory::GetInstance()->GetCatInstance();
    pCat->LikeEat();

    animalIF* pDog = CAnimalFactory::GetInstance()->GetCatInstance();
    pDog->LikeEat();

    system("PAUSE");
    return 0; 
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++工厂类和单例模式的结合使用 的相关文章

  • 为什么相同的代码在同一台计算机上的执行时间可能不同?

    我是 C 编程新手 我编写了代码并希望获得它的运行时 这就是我所做的 每次运行代码时 我都会得到不同的运行时值 这样对吗 或者我的代码有问题吗 int main int argc char argv time t start end sta
  • 如何在 C++ 中的文件末尾添加数据?

    我已按照网上的说明进行操作 此代码应该将输入添加到文件 数据库 的末尾 但当我检查时 数据会覆盖现有数据 请帮忙 这是我的代码 int main string name string address string handphone cou
  • 在 C# 中创建具有单独列的分隔文本

    我一直在尝试在 C 中创建一个制表符限制的文本文件 以便数据正确显示在单独的列中 Firstname Lastname Age John Smith 17 James Sawyer 31 我尝试过 t 字符 但我得到的只是 Firstnam
  • 如何读取扩展文件属性/文件元数据

    因此 我按照教程使用 ASP net core 将文件 上传 到本地路径 这是代码 public IActionResult About IList
  • 如何为 C 分配的 numpy 数组注册析构函数?

    我想在 C C 中为 numpy 数组分配数字 并将它们作为 numpy 数组传递给 python 我可以做的PyArray SimpleNewFromData http docs scipy org doc numpy reference
  • 互斥体实现可以互换(独立于线程实现)

    所有互斥体实现最终都会调用相同的基本系统 硬件调用吗 这意味着它们可以互换吗 具体来说 如果我使用 gnu parallel算法 使用openmp 并且我想让他们称之为线程安全的类我可以使用boost mutex用于锁定 或者我必须编写自己
  • C++中的类查找结构体数组

    我正在尝试创建一个结构数组 它将输入字符串链接到类 如下所示 struct string command CommandPath cPath cPathLookup set an alarm AlarmCommandPath send an
  • 无法在 Windows 运行时组件库的 UserControl 中创建依赖项属性

    我想在用户控件内创建数据可绑定属性 这个用户控件包含一个 Windows 运行时组件 项目 我使用下面的代码来创建属性 public MyItem CurrentItem get return MyItem GetValue Current
  • 获取 WPF 控件的所有附加事件处理程序

    我正在开发一个应用程序 在其中动态分配按钮的事件 现在的问题是 我希望获取按钮单击事件的所有事件 因为我希望删除以前的处理程序 我尝试将事件处理程序设置为 null 如下所示 Button Click null 但是我收到了一个无法分配 n
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • 在一个字节中存储 4 个不同的值

    我有一个任务要做 但我不知道从哪里开始 我不期待也绝对不想要代码中的答案 我想要一些关于该怎么做的指导 因为我感到有点失落 将变量打包和解包到一个字节中 您需要在一个字节中存储 4 个不同的值 这些值为 NAME RANGE BITS en
  • 如何在 Blackberry Cascades 中显示具有特定号码的电话板

    我正在使用带有 C QT 和 QML 的 Blackberry Cascades 10 Beta 3 SDK 以及 Blackberry 10 Dev Alpha Simulator 和 QNX Momentics IDE 并且我正在尝试实
  • 如何将自定义 JSON 文件添加到 IConfiguration 中?

    我正在使用 asp net Autofac 我正在尝试加载自定义 JSON 配置文件 并基于该文件创建 实例化 IConfiguration 实例 或者至少将我的文件包含到默认情况下构建的 IConfiguration asp net 中
  • 私有模板函数

    我有一堂课 C h class C private template
  • HttpWebRequest 在第二次调用时超时

    为什么以下代码在第二次 及后续 运行时超时 代码挂在 using Stream objStream request GetResponse GetResponseStream 然后引发 WebException 表示请求已超时 我已经尝试过
  • 有没有办法强制显示工具提示?

    我有一个验证字段的方法 如果无法验证 该字段将被清除并标记为红色 我还希望在框上方弹出一个工具提示 并向用户显示该值无效的消息 有没有办法做到这一点 并且可以控制工具提示显示的时间 我怎样才能让它自己弹出而不是鼠标悬停时弹出 If the
  • 英特尔 Pin 与 C++14

    问题 我有一些关于在 C 14 或其他 C 版本中使用英特尔 Pin 的问题 使用较新版本从较旧的 C 编译代码很少会出现任何问题 但由于 Intel Pin 是操作指令级别的 如果我使用 C 11 或 C 14 编译它 是否会出现任何不良
  • 防止在工厂方法之外实例化对象

    假设我有一个带有工厂方法的类 class A public static A newA Some code logging return new A 是否可以使用 a 来阻止此类对象的实例化new 那么工厂方法是创建对象实例的唯一方法吗 当
  • 如何使用 Word Automation 获取页面范围

    如何使用办公自动化找到 Microsoft Word 中第 n 页的范围 似乎没有 getPageRange n 函数 并且不清楚它们是如何划分的 这就是您从 VBA 执行此操作的方法 转换为 Matlab COM 调用应该相当简单 Pub
  • 如何正确使用 std::condition_variable?

    我很困惑conditions variables以及如何 安全 使用它们 在我的应用程序中 我有一个创建 gui 线程的类 但是当 gui 是由 gui 线程构造时 主线程需要等待 情况与下面的函数相同 主线程创建互斥体 锁和conditi

随机推荐

  • java 手写一个简易的 tomcat 服务器

    最近想学一下 tomcat 到底是怎么运行的 于是手写一个简易的 tomcat 服务器 加深一下印象 涉及到的知识 计算机网络 tcp ip 协议 网络编程 socket 浏览器请求 响应报文规范 java 反射 注解 实现的功能 可打包成
  • Web自动化测试(3)-Unittestreport

    HTML报告 目录 HTML报告 1 Unittest自动化报告生成 2 Unittestreport安装 3 使用Unittestreport生成测试报告 1 Unittest自动化报告生成 在使用Unittest进行自动化测试时 往往需
  • 【zookeeper】ZooKeeper 权限管理与Curator增加权限验证

    文章目录 1 概述 2 种类 2 1 scheme 2 1 1 world 2 1 2 digest 2 1 2 1 shell认证 2 1 2 2 zookeeper 2 1 2 Curator 2 1 3 id 3 permission
  • QGIS学习资料

    QGIS学习资料整理 1 QGIS Tutorials and Tips 网址 https www qgistutorials com en
  • /var/lib/docker目录迁移

    简介 docker用起来简单 但是要用到实际线上业务当中细节问题往往影响整个系统的稳定 比如docker容器在物理机上的数据卷问题 docker默认的根目录是 var lib docker 容器使用一段时间后会发现该目录所占磁盘会非常大 小
  • js获取当前ip地址

    方法一 用搜狐的接口查询IP地址 方法二 国外一个网站提供的ip查询服务
  • Web学习笔记-React(路由)

    笔记内容转载自 AcWing 的 Web 应用课讲义 课程链接 AcWing Web 应用课 CONTENTS 1 Web分类 2 Route组件 3 URL中传递参数 4 Search Params传递参数 5 重定向 6 嵌套路由 本节
  • 纯js判断文件流格式类型:pdf,doc,docx,xls,xlsx,ppt,pptx一次搞定!

    目录 使用js判断文件类型的场景 方法特点 输入输出 方法步骤 1 查看每种格式文件的16进制码 提取不同文件类型的 特征数 2 先判断大类型 在具体大类下判断小类型 项目地址 纯前端基于react实现的多类型文件预览 通过arraybuf
  • java中的string是什么意思_java中String[][] 是什么东西?string[]又是什么东西?

    展开全部 String 是二维数组 例如 String str new String 4 4 这是创建了一个有4行4列元32313133353236313431303231363533e78988e69d8331333366306433素的
  • 看完这篇 教你玩转渗透测试靶机vulnhub——FunBox11(Scriptkiddie)

    Vulnhub靶机FunBox11 Scriptkiddie 渗透测试详解 Vulnhub靶机介绍 Vulnhub靶机下载 Vulnhub靶机安装 Vulnhub靶机漏洞详解 信息收集 FTP匿名登入 漏洞发现 漏洞利用 获取flag Vu
  • 解读《“三板斧”-阿里巴巴管理之道》

    三板斧 阿里巴巴管理之道 1 管理的真相是什么 三板斧 是阿里巴巴的一门培训课程 形象一点比喻分别是 揪头发 指组织中的向上思考 照镜子 指团队中的自我认知 闻味道 指发展中的精神融合 这三点说的是组织中的管理者如何通过管理团队的力量 成就
  • 如何在Win10中安装Visual Studio 6.0

    随着微软Windows操作系统的不断升级 尤其是升级到64位系统后 很多原有32位的开发软件在如今的win10 11系统上运行时会遇到很多问题 比如 笔者就曾遇到的过去很熟悉的VC 6 0在win10中安装后 一打开文件 程序就闪退的问题
  • redis基础1——发展历程+源码安装及配置+基本常识

    文章目录 一 NOSQL概述 1 1 单机Mysql的演进 1 2 什么是Nosql 1 3 Nosql的四大分类 1 3 1 KV键值对型 1 3 2 文档型数据库 bson格式 和json一样 1 3 3 列存储数据库 1 3 4 图数
  • PCB中电流与线宽 电流与过孔的关系

    1 一般认为20mil走线可以过1A电流 有一定余量 2 0 5mm 20mil 过孔可以过1A电流 有一定余量 如果2A电流放置0 25mm 10mil 过空作为载流 至少放置四个过孔 制作最小过孔的能力与板厂的制作能力和工艺有关系 嘉立
  • mysql设置开机自启后依然无法自启动

    一般情况下设置的开机自启 一般情况下这样设置就可以实现开机自启了 但是有部分天选之子不行 例如看见博客的你我 明明设置了开机自启 但每次打开数据库却连不上 还需要自己手动启动 乌鱼 解决办法 1 第一步 我们查看系统启动日志 方法如下 cm
  • python运维开发工程师养成记(break语句)

    图示 案例 下节分享continue语句 链接 https ke qq com course 4300856 tuin d8aedf68
  • 【区块链】#区块链 ipfs介绍及环境配置

    需要在答辩之前做一点demo进行展示 好给评委老师展示我们的预期成果 组长最后挑选了IPFS作为初级的展示工具 我们的第一次在链上操作就开始了 区块链具有去中心化 不可篡改 智能合约的一些特性 其实大家都知道区块链是这几年因为比特币的火而赶
  • Java:进化的尽头

    Java Evolutionary Dead End January 3 2008 我在比利时安特卫普举办的Javapolis大会上刚做完一个主题演讲 现在是周五早上 前一天Josh Bloch作了发言 谈到了在closures 闭包 建议
  • React 入门 以及使用antd框架,并且封装分页组件、使用表格分页

    安装 安装React项目 npm i g create react app create react app demo demo就是的项目名字 Ant Design 框架的安装 npm install antd save 找到APP css
  • C++工厂类和单例模式的结合使用

    单例模式 简单来说一个类只有一个实例且封装性好 这里用宏定义实现 animal singleton h pragma once include