《面试准备》C++工厂模式

2023-11-08

工厂模式

参考:https://www.cnblogs.com/huiz/p/8232783.html

1、简单工厂模式

在工厂类做判断,从而创建相应的产品,当增加产品时需要修改工厂类。

#include <iostream>
#include <stdlib.h>
#include <string>
using namespace std;

//简单工厂模式
//枚举
enum cartype{benci,baoma};
//抽象类(多态:提高基类)
class car{
public:
    virtual void createcar(void)=0;
};
//具体类(产品1)
class bencicar:public car{
public:
    bencicar(){
        cout<<" begin create bencicar "<<endl;
    }
    void createcar(void){
        cout<<" creating bencicar "<<endl;
    }
    ~bencicar(){}
};
//具体类(产品2)
class baomacar:public car{
public:
    baomacar(){
        cout<<" begin create baomacar "<<endl;
    }
    void createcar(void){
        cout<<" creating baomacar "<<endl;
    }
    ~baomacar(){}
};
//工厂类
class carfactory{
public:
    car* createSpecificCar(cartype type){
        switch(type){
        case benci:
            return (new bencicar());
            break;
        case baoma:
            return (new baomacar());
            break;
         default:
            return NULL;
            break;
        }
    }
};

int main(){
    carfactory producecar;
    car *newcar1 = producecar.createSpecificCar(benci);
    car *newcar2 = producecar.createSpecificCar(baoma);
    newcar1->createcar();
    newcar2->createcar();
    return 0;
}

2、工厂方法模式

抽象工厂类,只提供一个接口,通过子类去扩展和实现

#include <iostream>
#include <stdlib.h>
#include <string>
using namespace std;

//工厂方法模式

//抽象类(多态:提高基类)
class car{
public:
    virtual void createcar(void)=0;
};
//具体类(产品1)
class bencicar:public car{
public:
    bencicar(){
        cout<<" begin create bencicar "<<endl;
    }
    void createcar(void){
        cout<<" creating bencicar "<<endl;
    }
    ~bencicar(){}
};
//具体类(产品2)
class baomacar:public car{
public:
    baomacar(){
        cout<<" begin create baomacar "<<endl;
    }
    void createcar(void){
        cout<<" creating baomacar "<<endl;
    }
    ~baomacar(){}
};
//抽象工厂类,提供创建产品类的接口
class carfactory{
public:
    virtual car* createSpecificCar()=0;
};

//工厂类子类
class bencifactory:public carfactory{
    car* createSpecificCar(){
        return (new bencicar());
    }
};
//工厂类子类
class baomafactory:public carfactory{
    car* createSpecificCar(){
        return (new baomacar());
    }
};

int main(){
    carfactory *producecar1 = new bencifactory();
    car *newcar1 = producecar1->createSpecificCar();
    newcar1->createcar();
    carfactory *producecar2 = new baomafactory();
    car *newcar2 = producecar2->createSpecificCar();
    newcar2->createcar();
    return 0;
}

 3、抽象工厂模式

当存在多个产品系列,而客户端只使用一个系列的产品时(选择普通产品还是高配产品),可以考虑使用抽象工厂模式。

缺点:当增加一个新系列的产品时,不仅需要现实具体的产品类,还需要增加一个新的创建接口,扩展相对困难。

#include <iostream>
#include <stdlib.h>
#include <string>
using namespace std;

//工厂方法模式

//抽象类(多态:提高基类)
class car{
public:
    virtual void createcar(void)=0;
};
class highcar{
public:
    virtual void createcar(void)=0;
};
//具体类(产品1)
class bencicar:public car{
public:
    bencicar(){
        cout<<" begin create bencicar "<<endl;
    }
    void createcar(void){
        cout<<" creating bencicar "<<endl;
    }
    ~bencicar(){}
};
//具体类(产品1,高性能)
class highbencicar:public highcar{
public:
    highbencicar(){
        cout<<" begin create highbencicar "<<endl;
    }
    void createcar(void){
        cout<<" creating highbencicar "<<endl;
    }
    ~highbencicar(){}
};
//具体类(产品2)
class baomacar:public car{
public:
    baomacar(){
        cout<<" begin create baomacar "<<endl;
    }
    void createcar(void){
        cout<<" creating baomacar "<<endl;
    }
    ~baomacar(){}
};
//具体类(产品2,高性能)
class highbaomacar:public highcar{
public:
    highbaomacar(){
        cout<<" begin create highbaomacar "<<endl;
    }
    void createcar(void){
        cout<<" creating highbaomacar "<<endl;
    }
    ~highbaomacar(){}
};
//抽象工厂类,提供创建产品类的接口
class carfactory{
public:
    virtual car* createSpecificCar()=0;
    virtual highcar* createSpecificHightCar()=0;
};

//工厂类子类
class bencifactory:public carfactory{
    car* createSpecificCar(){
        return (new bencicar());
    }
    highcar* createSpecificHightCar(){
        return (new highbencicar());
    }
};
//工厂类子类
class baomafactory:public carfactory{
    car* createSpecificCar(){
        return (new bencicar());
    }
    highcar* createSpecificHightCar(){
        return (new highbaomacar());
    }
};

int main(){
    carfactory *producecar1 = new bencifactory();
    car *newcar1 = producecar1->createSpecificCar();
    newcar1->createcar();
    carfactory *producecar2 = new baomafactory();
    highcar *newcar2 = producecar2->createSpecificHightCar();
    newcar2->createcar();
    return 0;
}

 

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

《面试准备》C++工厂模式 的相关文章

  • Java复习-25-单例设计模式

    单例设计模式 目的 使用场景 在实际开发下 会存在一种情况 某一种类在程序的整个生命周期中 只需要实例化一次就足够了 例如 系统数据类 由于操作系统只有一个 因此在程序初始化时该类只需要实例化一次 之后的系统数据更改都是在这一个实例化对象中
  • 设计模式的 C++ 实现---原型模式

    前文回顾 单例模式 一 单例模式 二 观察者模式 简单工厂模式 工厂方法模式 一 工厂方法模式 二 抽象工厂模式 一 抽象工厂模式 二 前言 原型模式指直接用一个已经存在的对象来创建一个新的对象 然后对新对象进行稍微修改即可 类似复制的操作
  • C++设计模式(8)——命令模式

    命令模式 亦称 动作 事务 Action Transaction Command 意图 命令模式是一种行为设计模式 它可将请求转换为一个包含与请求相关的所有信息的独立对象 该转换让你能根据不同的请求将方法参数化 延迟请求执行或将其放入队列中
  • 23种设计模式之装饰模式

    装饰模式 一个简陋的房子 它可以让人在里面居住 为人遮风避雨 但如果给它进行装修 那么它的居住环境就更加宜人了 程序中的对象也与房子十分类似 首先有一个相当于 房子 的对象 然后经过不断装饰 不断对其增加功能 它就变成了使用功能更加强大的对
  • 行为型模式-策略模式

    package per mjn pattern strategy 抽象策略类 public interface Strategy void show package per mjn pattern strategy 具体策略类 用来封装算法
  • 设计模式之(三)---工厂方法模式

    女娲补天的故事大家都听过吧 这个故事是说 女娲在补了天后 下到凡间一看 哇塞 风景太优美了 天空是湛 蓝的 水是清澈的 空气是清新的 太美丽了 然后就待时间长了就有点寂寞了 没有动物 这些看的到 都是静态的东西呀 怎么办 别忘了是神仙呀 没
  • java需会(转载)

    一 基础篇 1 1 Java基础 面向对象的特征 继承 封装和多态 final finally finalize 的区别 Exception Error 运行时异常与一般异常有何异同 请写出5种常见到的runtime exception i
  • 设计模式--组合模式

    组合模式 又叫部分整体模式 属于结构型模式 基本原理 以树形的结构将相似的对象组合起来 主要流程 1 创建对象 2 在对象中设置用来存放下一级相似对象的数据结构 3 在对象中设置增删改查等功能 注意 这种模式和数据结构中的树形结构相似 in
  • 设计模式学习之装饰器模式

    装饰器 Decorator 模式跟适配器 Adapter 模式一样 属于构建型设计模式 在学习适配器模式的时候说过 适配器模式的重点在复用能力 装饰器模式的重点在扩展能力 换言之 装饰器模式是先复用后扩展 这也导致了很多人跟适配器模式混淆
  • 设计模式 -- 工厂模式(Factory Pattern)

    简单工厂模式 Simple Factory Pattern 根据传入的参数决定实例化哪个对象 优点 不直接在客户端创建具体产品的实例 降低了耦合性 缺点 违反了开闭原则 对扩展开放 对修改关闭 不容易形成高内聚松耦合结构 每当我们增加一种产
  • 设计模式(5)-适配器模式(Adapter Pattern)

    适配器模式 Adapter Pattern 顾名思义 就像变压器 转接头差不多 就像美国的生活电压是110V 中国是220V 就需要一个变压器将220V转换成110V 或者一个Type C接口想插如USB接口的东西 你就需要一个转换器 而这
  • HeadFirst 设计模式学习笔记10——MVC分析

    1 M V C Model View Controller 模式 视图 控制器 这是一种范型 模型对象正是应用系统存在的理由 你设计的对象 包含了数据 逻辑和其他在你的应用领域创建定制的类 视图通常是控件 用来显示和编辑 控制器位于二者中间
  • Tomcat 系统架构与设计模式之工作原理篇

    本文以 Tomcat 5 为基础 也兼顾最新的 Tomcat 6 和 Tomcat 4 Tomcat 的基本设计思路和架构是具有一定连续性的 Tomcat 总体结构 Tomcat 的结构很复杂 但是 Tomcat 也非常的模块化 找到了 T
  • 程序员必知的23种设计模式之组合模式

    文章目录 1 模式引出 学校院系展示需求 1 1 传统方案 1 2 传统方案问题分析 2 组合模式基本介绍 2 1 方案修改 3 组合模式解决的问题 4 组合模式的注意事项和细节 1 模式引出 学校院系展示需求 编写程序展示一个学校院系结构
  • 泛型与反射机制在JDBC和Servlet编程中的实践

    写在前面 泛型与反射是java中的两种强大机制 可以很好的提高代码的灵活性和复用性 本篇文章向大家展现在JDBC和Servlet编程场景下反射和泛型技术的实践 通过灵活使用这两种机制打造 高度可复用的JDBC和Servlet代码 1 JDB
  • 设计模式详解---策略模式

    1 策略模式简介 策略模式 Strategy Pattern 是一种行为型设计模式 用于在运行时根据不同的情境选择不同的算法或策略 该模式将算法封装成独立的类 使得它们可以相互替换 而且可以独立于客户端使用它们的方式 1 1 主要角色 上下
  • Java设计模式:模板方法模式

    作者主页 欢迎来到我的技术博客 个人介绍 大家好 本人热衷于 Java后端开发 欢迎来交流学习哦 如果文章对您有帮助 记得 关注 点赞 收藏 评论 您的支持将是我创作的动力 让我们一起加油进步吧 文章目录 一 模板方法模式的定义 二 模板方
  • C++设计模式 #3策略模式(Strategy Method)

    动机 在软件构建过程中 某些对象使用的的算法可能多种多样 经常改变 如果将这些算法都写在类中 会使得类变得异常复杂 而且有时候支持不频繁使用的算法也是性能负担 如何在运行时根据需求透明地更改对象的算法 将算法和对象本身解耦 从而避免上述问题
  • 【设计模式之美】理论一:怎么才算是单一原则、如何取舍单一原则

    文章目录 一 如何判断类的职责是否足够单一 二 类的职责是否设计得越单一越好 开始学习一些经典的设计原则 其中包括 SOLID KISS YAGNI DRY LOD 等 本文主要学习单一职责原则的相关内容 单一职责原则的定义 一个类只负责完
  • 【设计模式之美】面向对象分析方法论与实现(二):需求到接口实现的方法论

    文章目录 一 进行面向对象设计 1 划分职责 gt 需要有哪些类 2 定义类及其属性和方法 3 定义类与类之间的交互关系 4 将类组装起来并提供执行入口 二 如何进行面向对象编程 1 接口实现

随机推荐

  • CV-第三方库:OpenMMLab---->MMClassification

    MMClassification 是一款基于 PyTorch 的开源图像分类工具箱 是 OpenMMLab 项目的成员之一 主分支代码目前支持 PyTorch 1 5 以上的版本 主要特性 支持多样的主干网络与预训练模型 支持配置多种训练技
  • Android 获取网络连接状态新方法

    一 问题背景 Android12上 有的app模块判断当前网络的类型和连接状态时 还是使用的旧的API 导致返回的结果不准确 影响代码逻辑判断 本篇文章就这一问题 整理一下判断网络类型和连接状态的新方法 二 原因分析 在Android 10
  • Flutter学习-TextField

    目录 focusNode 获取焦点 decoration InputDecoration边框装饰 keyboardType TextInputType 输入的类型 textCapitalization TextCapitalization
  • 使用Angular编写用户管理系统前台界面

    目录 工作准备 项目框架 功能描述 工作准备 安装node js node js中包含了npm node v查看node版本 npm v查看npm版本 全局安装angular CLI npm install g angular cli ng
  • win11系统激活修复

    打开终端 输入以下代码 irm https massgrave dev get iex 在弹出的窗口中 选择1即可
  • jquery 中 $(".XXX") 和 $("#XXX")的区别

    XXX 为获取类名为XXX的类 XXX 为获取id为XXX的标签
  • cesium 申请秘钥(Cesium.Ion.defaultAccessToken/access_token)

    https cesium com ion signin tokens 然后注册 登录 复制使用 Cesium Ion defaultAccessToken 你的 token 案例
  • Delphi TIdTCPClient的使用问题

    开发环境Delphi10 3 3 使用TIdTCPClient写了一个客户端小例子 使用网络调试助手作为服务端 设置接收到客户端信息会自动返回数据 通讯模式 短连接 客户端连接 发送 等待数据 接收 断开 此例子中客户端不知道返回信息长度是
  • Android动态界面开发框架Tangram使用完整教程(转载)

    原文链接 https blog csdn net u013541140 article details 89517186 Github地址 https github com jimmysuncpt TangramDemo
  • Unity3D设置天空盒skybox

    由于又忘记了 就写一篇博客做下笔记 此方法适用于5 X版本和2017版本 之后是否可行未测试 设置天空盒有两种方式 一 在当前相机上添加skybox 二 在当前场景上添加skybox 两种方式的结果是一样的 第一种方式的优势在于 如果 世界
  • elementUI +vue表单验证 后台请求动态验证

    elementUI vue表单验证 后台请求动态验证 在
  • grub 配置文件

    DO NOT EDIT THIS FILE It is automatically generated by grub mkconfig using templates from etc grub d and settings from e
  • Python刷题记录(91-95)

    Python刷题记录 91 95 题目来源PTA平台 PAT Basic Level Practice 中文 TOC 1091 N 自守数 如果某个数 K 的平方乘以 N 以后 结果的末尾几位数等于 K 那么就称这个数为 N 自守数 例如
  • C++socket编程(三):3.1 TCP/IP协议特点

    1 TCP是面向连接的 就是当你想要开始传递数据的时候 之前应该先把连接建立起来 它不像UDP协议 可以直接发送数据 2 TCP提供可靠的数据传输 实现了丢失重传 RTT的估算 3 TCP通过给所发送数据的每一个段管理一个序号进行排列 每一
  • int a 和int*a = new int 的区别

    int a 是分配在栈上的 会自动地释放 int a new int 分配在堆上面的 需要程序员手动地释放不然会造成内存的泄漏
  • 【git】在删除某一commit时出现error: The following untracked working tree files would be overwritten by checkou

    问题 error The following untracked working tree files would be overwritten by checkout test1 gitignore test1 matplotlib pl
  • redis学习04-jedis和redisson

    jedis是什么 jedis是为了方便在java代码中让java程序员操作redis命令而产生的 redisson是什么 redisson是为了更好的让java程序员能够按照正常书写java代码中的那些集合类的思维去操作redis 离开re
  • react搭建websocket通信架构

    前言 随着跨端技术的发展 前端开发职能不再局限于浏览器 而是具备了很多客户端开发的能力 比如桌面应用框架Electorn 移动App框架React native 一般而言 前端同学对http协议非常熟悉 在平时的工作中使用http与后端通信
  • MySQL主从自增列AUTO_INCREMENT不同步

    环境信息 MySQL版本 5 7 32 架构 一主 192 168 1 110 3306 一从 192 168 1 111 3306 binlog on binlog row image full binlog format row gti
  • 《面试准备》C++工厂模式

    工厂模式 参考 https www cnblogs com huiz p 8232783 html 简单工厂模式 在工厂类做判断 从而创建相应的产品 当增加产品时需要修改工厂类 include