设计模式的 C++ 实现---工厂方法模式(二)

2023-11-19

前文回顾
单例模式(一)
单例模式(二)
观察者模式
简单工厂模式
工厂方法模式(一)

前言

对于工厂方法模式,当增加新产品时,也需要对应增加一个工厂类。可以使用模版进行封装,减少代码工作量。

实现举例

  1. 产品抽象基类
class Animal
{
public:

    virtual ~Animal(){}
    virtual void show() = 0;
};
  1. 产品派生类
    ①.Dog 类
#include "animal.h"
#include <iostream>
using namespace std;

class Dog : public Animal
{
public:
    Dog(){};
    void show() override
    {
       cout << "汪汪~"<<endl;
    }
    static Animal * getDog()
    {
        return new Dog();
    }
};

②.Cat 类

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

class Cat : public Animal
{
public:
    Cat(){}
    void show() override
    {
        cout << "喵~"<<endl;
    }
    static Animal * getCat()
    {
        return new  Cat();
    }
};
  1. 工厂模版基类
template<typename A>
class AnimalFactoryTemplate
{
public:
    AnimalFactoryTemplate(){};
    virtual ~AnimalFactoryTemplate() {}
    virtual A * CreateAnimal() = 0;
};
  1. 工厂派生类
#include "animalfactorytemplate.h"
template<typename A,typename T >
class AnimalFactory:public AnimalFactoryTemplate<A>
{
public:

   A * CreateAnimal()
   {
       return new T();
   }
};
  1. 客户端调用
#include "animal.h"
#include "dog.h"
#include "cat.h"
#include "animalfactory.h"
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    AnimalFactory<Animal,Dog> dogfactory;
    Animal * dog = dogfactory.CreateAnimal();
    dog->show();

    AnimalFactory<Animal,Cat> catfactory;
    Animal * cat = catfactory.CreateAnimal();
    cat->show();

    delete dog;
    delete cat;


    return a.exec();
}

在这里插入图片描述

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

设计模式的 C++ 实现---工厂方法模式(二) 的相关文章

  • 从 Makefile 中的 C++FLAGS 中删除一个标志?

    我有一个 Makefile 其中包含另一个设置了很多默认值的 makefile 我无法编辑包含的 makefile 并且我想更改 makefile 中 C FLAGS 的值 即使它是在包含的 makefile 中设置的 具体来说 每当 de
  • 使用 C#.net 中的私有存储库的身份验证读取 BitBucket API

    我已经尝试了几天让 BitBucket API 为我工作 但是当涉及到让它为具有身份验证的私有存储库工作时 将问题设置为私有 当它们设置为公开 无需身份验证 一切正常 代码示例如下 static void Main string args
  • 函数“sum”的隐式声明在 C99 中无效

    我一直在寻找解决方案 但没有找到任何有帮助的东西 我收到以下错误 Implicit declaration of function sum is invalid in C99 Implicit declaration of function
  • 为什么在排序输入上插入到树中比随机输入更快?

    现在我一直听说从随机选择的数据构建二叉搜索树比有序数据更快 这仅仅是因为有序数据需要显式重新平衡以将树高度保持在最低限度 最近我实现了一个不可变的treap http en wikipedia org wiki Treap 一种特殊的二叉搜
  • 为什么模板类的静态成员不唯一

    看一下下面的代码 include
  • 如何将动态数据写入 MVC 3 Razor 中的页面布局?

    我有带有 Razor 引擎的 MVC 3 C 项目 将动态数据写入 Layout cshtml 的方法和最佳实践是什么 例如 也许我想在网站的右上角显示用户名 该名称来自会话 数据库或基于用户登录的任何内容 更新 我也在寻找将某些数据渲染到
  • ptrace和waitpid有什么关系?

    我正在练习使用ptrace但我不太了解它和之间的关系waitpid 这是我的测试程序 int main int argc char argv pid t pid 22092 if ptrace PTRACE ATTACH pid NULL
  • 如何准备sql语句并绑定参数?

    不幸的是 文档 http www sqlite org完全缺乏示例 这真的很奇怪 就好像它假设所有读者都是优秀的程序员一样 然而 我对C 并且无法真正从文档中弄清楚如何真正准备和执行语句 我喜欢它的实施方式PDO for PHP 通常 我只
  • C# 中输入按键

    我尝试了这段代码 private void textBox1 KeyPress object sender KeyPressEventArgs e if Convert ToInt32 e KeyChar 13 MessageBox Sho
  • C 中的双重否定:是否保证返回 0/1?

    Is x 标准保证返回0 1 请注意 我是not询问 C 其中定义了 bool 类型 是的 在 C99 中 请参阅 6 5 3 3 4 逻辑非运算符的结果 是0如果其操作数的值比较 不等于0 1如果其操作数的值比较等于 0 结果具有类型in
  • 指向 VLA 的指针

    你可能知道 VLA 的优点和缺点 https stackoverflow com a 3082302 1606345在 C11 中它们是可选的 我认为使 VLA 成为可选的主要原因是 堆栈可能会爆炸 int arr n where n 10
  • C# 中的类和模块有什么用

    有人可以解释一下类和模块之间的区别吗 你什么时候使用其中一种而不是另一种 我正在使用 C 更新 我的意思是相当于 VB 模块的 C 版本 这在很大程度上取决于您所指的 模块 Visual Basic 的模块 C 中没有真正等效的 VB Ne
  • C# 从今天起 30 天

    我需要我的应用程序从今天起 30 天后过期 我会将当前日期存储在应用程序配置中 如何检查应用程序是否已过期 我不介意用户是否将时钟调回来并且应用程序可以正常工作 用户太愚蠢而不会这样做 if appmode Trial string dat
  • 来自用户定义文字的整数字符序列,以字符串作为参数

    目前 只有双精度数可以在用户定义的文字中生成字符模板 template
  • 没有 FPU 的处理器中的浮点计算

    是否可以在没有浮点单元的嵌入式处理器中执行浮点运算 是的 您只需要在软件中完成即可 你的编译器可能会提供支持 http gcc gnu org onlinedocs gccint Soft float library routines ht
  • OpenSSL:无需 SSL_read() / SSL_write() 即可执行加密/解密

    我已经用 C 语言编写了一个基于事件的网络库 现在我想通过 OpenSSL 添加 SSL TLS 支持 而不是使用SSL read and SSL write 我宁愿让 OpenSSL 只执行传出 传入数据的加密 解密 让我自己传输 接收数
  • 为什么在 C++ 类中的数据成员上使用像 m_ 这样的前缀?

    许多 C 代码使用语法约定来标记数据成员 常见的例子包括 m memberName对于公共成员 在所有使用公共成员的情况下 memberName对于私人会员或所有会员 其他人尝试强制使用this gt member每当使用数据成员时 根据我
  • 曲线/路径骨架二值图像处理

    我正在尝试开发一个可以处理图像骨架的路径 曲线的代码 我想要一个来自两点之间骨架的点向量 该代码在添加一些点后结束 我没有找到解决方案 include opencv2 highgui highgui hpp include opencv2
  • SQL Server CE 不兼容的数据库版本

    我有一个 SQL Server CE 4 0 数据库 sdf文件 当我尝试从我的应用程序 WPF 对数据库进行查询时 出现以下错误 数据库版本不兼容 如果这是兼容文件 请运行修复 其他情况请参考文档 数据库版本 4000000 请求的版本
  • Cordova 上的 ClearCookiesAsync()

    我正在尝试使用 wp8 cordova 中的插件来清除 WebBrowser cookie 我已经让它与 JavaScript 进行通信 并且我的 c 文件中有类似这样的内容 using WPCordovaClassLib Cordova

随机推荐

  • java 读取ssh2协议得到的数据_Java通过SSH2协议执行远程Shell脚本

    Java通过SSH2协议执行远程Shell脚本 ganymed ssh2 build210 jar ganymed ssh2简介 Ganymed SSH 2 for Java是用纯Java实现SSH 2协议的一个包 在使用它的过程中非常容易
  • QT中信号和信号槽详解

    如何选择QDialogButtonBox的信号与槽 1 UI中设计了一个QDialogButtonBox 按钮为Cancel和Apply 2 构造函数连接 connect ui gt buttonBox SIGNAL accepted th
  • SpringBoot配置多数据源,三数据源,mysql+oracle+mysql

    废话不多说 直接上代码 yml文件配置 server port 8080 spring datasource primary
  • 小谈设计模式(1)—总序

    小谈设计模式 1 总序 专栏地址 开始操作 设计模式总论 设计模式是什么 组成要素 模式名称 问题描述 解决方案 效果描述 设计模式有什么作用 提供可重用的解决方案 提高代码的可读性和可维护性 促进代码的可扩展性 提高代码的灵活性和可重用性
  • llvm之IR手册翻译(5)

    原网址是 http llvm org docs LangRef html abstract 下面这些是我自己的翻译 肯定有很多不恰当的地方 做这些只是希望自己以后翻阅更加方便 如果能对大家有所帮助那是极好的 别名 别名 不像函数或变量 不会
  • OSError:...libcublasLt.so.11 with link time reference

    程序运行时报错 OSError u01 anaconda3 envs modlscope py39 lib python3 9 site packages nvidia cublas lib libcublas so 11 symbol c
  • 无法从命令行或调试器启动服务,必须首先安装Windows服务....。在“安装”阶段发生异常。 System.Security.SecurityException:未找到源

    此处一共两个问题 第一个问题完整描述是 无法从命令行或调试器启动服务 必须首先安装Windows服务 使用installutil exe 然后用ServerExplorer Windows服务器管理工具或NET START命令启动它 第二个
  • Python基础教程:强大的Pandas数据分析库

    Pandas是一个基于 NumPy 的非常强大的开源数据处理库 它提供了高效 灵活和丰富的数据结构和数据分析工具 当涉及到数据分析和处理时 使得数据清洗 转换 分析和可视化变得更加简单和高效 本文中 我们将学习如何使用Pandas来处理和分
  • 集合addAll方法使用存在的问题。

    集合addAll 方法的时候 这里里有两个集合 集合2要拿到集合1中的元素 然后对集合2进行removeAll方法 结果集合1中的值也没有了 只是因为listTwo listOne 只是把集合1的引用给了集合2 集合1和集合2的引用是指向同
  • GDB and Reverse Debugging

    Overview GDB version 7 0 due September 2009 will be the first public release of gdb to support reverse debugging the abi
  • PTA基础题练习-检查密码

    PTA 检查密码 本题要求你帮助某网站的用户注册模块写一个密码合法性检查的小功能 该网站要求用户设置的密码必须由不少于6个字符组成 并且只能有英文字母 数字和小数点 还必须既有字母也有数字 输出格式 输入样例 输出样例 本题要求你帮助某网站
  • Linux学习(一):查看文件目录的几种常用方式

    一 将主文件夹下的所有文件列出来 包括属性与隐藏文件 完整呈现文件的修改时间 注意 无论如何 ls最长被使用到的功能还是那个 l的参数 为此很多distribution在默认的情况中 已经将ll l的小写 设置成为ls l的意思了 这个功能
  • kodi没有中文设置_kodi播放器设置中文的方法

    KODI播放器是一款强大的多媒体播放器 其能够支持目前几乎所有的主流格式文件的播放 而且除了视频文件外 即使是音乐 图片 电视节目等其他媒体文件也能够正常进行播放 而且能够支持投屏扥更种辅助功能 为用户提供了一套完整的播放方案 因而广受用户
  • zookeeper学习草稿纸

    指令重排序 https baijiahao baidu com s id 1701616903992143186 wfr spider for pc JVM JDK JRE 静态方法为什么不能调用非静态成员 重载和重写的区别 可变参数 基本
  • 高质量、高并发的实时通信架构设计与探索

    中国互联网络信息中心 CNNIC 近日发布的第 47 次 中国互联网络发展状况统计报告 显示 截至 2020 年 12 月 我国网民规模达 9 89 亿 随着社会信息化水平持续提升及电子设备加速普及 手机网民规模持续增长 基本实现对全体网民
  • 关于Semaphore信号量的源码解读

    Semaphore的简单使用 利用Semaphore可以实现对线程数量的控制 比如如下的代码 class SemaphoreTest public static void main String args Semaphore semapho
  • 【RTX 3060Ti 深度学习环境配置图文(安装Anaconda、VScode、CUDA、CUDNN、pytorch)】

    RTX 3060Ti 深度学习环境配置图文 安装Anaconda VScode CUDA CUDNN pytorch 配置 安装驱动 一 安装Anaconda 1 1 Anaconda简介 1 2 下载Anaconda 1 3安装Anaco
  • SpringBoot集成jasypt,加密yml配置文件

    SpringBoot集成jasypt 加密yml配置文件 一 pom配置 二 生成密文代码 三 配置 3 1 yml加密配置 3 2 密文配置 3 3 启动配置 3 4 部署配置 四 遇到的一些坑 最新项目安全检测 发现配置文件中数据库密码
  • Spring学习笔记day01——Spring入门

    Spring学习 Spring介绍 1 1Spring概述 Spring是一个开源框架 Spring是于2003 年兴起的一个轻量级的Java 开发框架 由Rod Johnson 在其著作Expert One On One J2EE Dev
  • 设计模式的 C++ 实现---工厂方法模式(二)

    前文回顾 单例模式 一 单例模式 二 观察者模式 简单工厂模式 工厂方法模式 一 前言 对于工厂方法模式 当增加新产品时 也需要对应增加一个工厂类 可以使用模版进行封装 减少代码工作量 实现举例 产品抽象基类 class Animal pu