《面试准备》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++工厂模式 的相关文章

  • Chain of Responsibility:责任链模式

    现有多个处理者 这些处理者可以处理不同的请求 这些处理者有等级关系 每个处理者都有更上级的处理者 对于最上级的处理者 可以没有上级 对于一个上级处理者 可以有多个下级处理者 客户端发出了一个请求 请求被传递给一个最下级处理者 而该处理者无法
  • C++设计模式(8)——命令模式

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

    简介 代理模式属于行为型模式的一种 控制对其他对象的访问 起到中介作用 代理模式核心角色 真实角色 代理角色 按实现方式不同分为静态代理和动态代理两种 意图 控制对其它对象的访问 类图 实现 JDK自带了Proxy的实现 下面我们先使用JD
  • C++设计模式(二)观察者模式

    1 观察者模式知识点 1 定义 定义对象间的一种一对多的依赖关系 当一个对象的状态发生改变的时候 所有依赖它的对象都得到通知并自动更新 2 动机 将一个系统分割成一系列相互协作的类有一个常见的副作用 需要维护相关对象间的一致性 我们不希望为
  • 小谈设计模式(1)—总序

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

    装饰者模式 涉及的重要设计原则 类应该对扩展开放 对修改关闭 装饰者模式定义 装饰者模式动态地将责任附加到对象上 若要扩展功能 装饰者提供了比继承更有弹性的替代方案 UML类图 装饰者模式事例 咖啡店 咖啡种类 1 深焙咖啡 DarkRoa
  • 简单工厂模式

    简单工厂模式 一 概念 从设计模式的类型上来说 简单工厂模式是属于创建型模式 又叫做静态工厂方法 StaticFactory Method 模式 但不属于23种GOF设计模式之一 简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例 简
  • 行为型模式-状态模式

    package per mjn pattern state after 环境角色类 public class Context 定义对应状态对象的常量 public final static OpeningState OPENING STAT
  • 设计模式-2--工厂模式(Factory Pattern)

    一 什么是工厂模式 工厂模式 Factory Pattern 是一种创建型设计模式 它提供了一种创建对象的接口 但是将对象的实例化过程推迟到子类中 工厂模式允许通过调用一个共同的接口方法来创建不同类型的对象 而无需暴露对象的实例化逻辑 工厂
  • 设计模式学习笔记-工厂模式

    设计模式学习笔记 工厂模式 作用 实现了创建者和调用者的分离 详细分类 简单工厂模式 用来生产同一等级结构中的任意产品 对于增加新的产品 必须要扩展已有的代码 工厂方法模式 用来生产同一等级结构中的固定产品 支持增加任意产品 抽象工厂模式
  • 【笔试】操作系统知识点整理

    一 操作系统概述 1 操作系统的主要功能 进程与处理机管理 作业和进程调度 进程控制和进程通信 存储管理 内存分配 地址映射 内存保护和内存扩充 设备管理 缓冲区管理 设备分配 设备驱动 设备无关性 文件管理 文件存储空间的管理 文件操作的
  • 单例模式的八种写法比较

    单例模式是最常用到的设计模式之一 熟悉设计模式的朋友对单例模式都不会陌生 一般介绍单例模式的书籍都会提到 饿汉式 和 懒汉式 这两种实现方式 但是除了这两种方式 本文还会介绍其他几种实现单例的方式 让我们来一起看看吧 简介 单例模式是一种常
  • java-IO流(5)-IO流中的设计模式(装饰器模式和适配器模式)的介绍

    目录 1装饰器模式 1 1定义 1 2代码实现 1 3装饰器特点 1 4装饰器在IO流中的使用 2配适器模式 2 1Adapter适配器 2 2代码实例 2 3适配器特点 2 4适配器优缺点 2 5适配器在IO中的使用 3装饰器与适配器异同
  • [设计模式]模板方法模式(Template Method)

    1 意图 定义一个操作中的算法的骨架 而将一些步骤延迟到子类中 TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 2 动机 其实就是如意图所描述的 算法的骨架是一样的 就是有些特殊步骤不一样 就可以
  • 设计模式——State(状态)模式

    目录 前言 1 定义 2 适用性 3 结构 3 1 结构图 3 2 参与者 4 应用举例 4 1 State TcpState 4 2 Context TcpConnection 4 3 ConcreteState ListeningTcp
  • 设计模式(2)

    2 2 结构型模式 结构型模式一共有七种 其中 适配器模式和装饰模式统称为包装模式 装饰模式和代理模式的类图基本相同 但目的不同 这些有相似目的或者有相似结构的模式需要对其概念辨析清楚 才能较好地掌握 下面将对结构型模式分别进行介绍 2 2
  • C++设计模式 #3策略模式(Strategy Method)

    动机 在软件构建过程中 某些对象使用的的算法可能多种多样 经常改变 如果将这些算法都写在类中 会使得类变得异常复杂 而且有时候支持不频繁使用的算法也是性能负担 如何在运行时根据需求透明地更改对象的算法 将算法和对象本身解耦 从而避免上述问题
  • 自动化测试面试题(附答案)

    1 自动化代码中 用到了哪些设计模式 单例设计模式 工厂模式 PO设计模式 数据驱动模式 面向接口编程设计模式 2 什么是断言 Assert 断言Assert用于在代码中验证实际结果是不是符合预期结果 如果测试用例执行失败会抛出异常并提供断
  • 【设计模式之美】 SOLID 原则之五:依赖反转原则:将代码执行流程交给框架

    文章目录 一 控制反转 IOC 二 依赖注入 DI 三 依赖注入框架 DI Framework 四 依赖反转原则 DIP 一 控制反转 IOC 通过一个例子来看一下 什么是控制反转 public class UserServiceTest
  • C++设计模式 --1.工厂模式和单例模式

    文章目录 1 工厂模式 简单工厂模式 工厂方法模式 抽象工厂模式 2 单例模式 懒汉式 饿汉式 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