C++:设计模式--工厂模式

news2025/6/3 1:23:58

更多内容:XiaoJ的知识星球


目录

  • 1.简单工厂模式
    • 1.1 简单工厂
    • 1.2 实现步骤
    • 1.3 实现代码
    • 1.4 优缺点
  • 2.工厂模式
    • 2.1 工厂模式
    • 2.2 实现步骤
    • 2.3 实现代码
    • 2.4 优缺点
  • 3.抽象工厂模式
    • 3.1 抽象工厂模式
    • 3.2 实现步骤
    • 3.3 实现代码
    • 3.4 优缺点


1.简单工厂模式

.

1.1 简单工厂

简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式

通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

.

1.2 实现步骤

1.提供一个工厂类

  • 简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。

2.提供一个抽象产品类

  • 简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

3.提供一个具体产品类

  • 简单工厂模式所创建的具体实例对象

在这里插入图片描述

.

1.3 实现代码

#include <iostream>
#include <string>
using namespace std;
//产品抽象父类
class Operation 
{    

public:
    double m_leftVlaue;
    double m_rightValue;
    virtual double GetResult() = 0;
};
//具体产品实现类
class AddOperation:public Operation
{
    double GetResult()
    {
        return m_leftVlaue + m_rightValue;
    }
};
class SubOperation :public Operation 
{
    double GetResult()
    {
        return m_leftVlaue - m_rightValue;
    }
};

class MulOperation :public Operation
{
    double GetResult()
    {
        return m_leftVlaue * m_rightValue;
    }
};

class DivOperation :public Operation
{
    double GetResult()
    {
        return m_leftVlaue / m_rightValue;
    }
};
//工厂类
class  OperatorFactory 
{
public:
    static  Operation* createOperation(char c) 
    {
        switch (c) 
        {
        case '+':
            return new AddOperation;
            break;
        case '-':
            return new SubOperation;
            break;
        case '*':
            return new MulOperation;
            break;
        case '/':
            return new DivOperation;
            break;
        }
    }
};
int main() 
{
    Operation* operation = OperatorFactory::createOperation('+');
    operation->m_leftVlaue = 1;
    operation->m_rightValue = 2;
    cout << operation->GetResult() << endl;
    return 0;
}

1.4 优缺点

优点

  • 帮助封装:实现组件封装,面向接口编程

  • 解耦合:客户端和具体实现类的解耦合

缺点

  • 可能增加客户端的复杂度

  • 不方便扩展子工厂

.


2.工厂模式

2.1 工厂模式

工厂方法模式,同样属于类的创建型模式,又被称为多态工厂模式 。

工厂方法模式的意义:

  • 定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。

  • 核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,

  • 这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工 厂角色的情况下引进新的产品

.

2.2 实现步骤

1.提供一个抽象工厂类 :所有具体工厂类的父类

2.提供与产品对应的工厂类:负责实例化产品对象

3.提供一个抽象产品类:所有产品的父类

4.提供一个或多个产品类:工厂方法模式所创建的具体实例对象
在这里插入图片描述
.

2.3 实现代码

#include <iostream>
using namespace std;
class AbstractProduct
{
public:
    virtual void makeProduct() = 0;
};

class AbstractFactory 
{
public:
    virtual AbstractProduct* createProduct() = 0;
};

class PlaneProduct :public AbstractProduct
{
public:
    void makeProduct() 
    {
        cout << "造飞机....." << endl;
    }
};
class PlaneFactory :public AbstractFactory 
{
public:
    AbstractProduct* createProduct()
    {
        AbstractProduct* product = new PlaneProduct;
        return product;
    }
};
class RocketProduct :public AbstractProduct
{
public:
    void makeProduct()
    {
        cout << "造火箭...." << endl;
    }
};
class RocketFactory :public AbstractFactory 
{
public :
    AbstractProduct* createProduct()
    {
        AbstractProduct* product = new RocketProduct;
        return product;
    }
};

int main() 
{
    //造飞机
    AbstractFactory* factory = new PlaneFactory;
    AbstractProduct* product = factory->createProduct();
    product->makeProduct();
    //造火箭
    factory = new RocketFactory;
    product = factory->createProduct();
    product->makeProduct();

    return 0;
}

.

2.4 优缺点

优点

  • 需求改变时改动最小

  • 具体的创建实例过程与客户端分离

缺点:

  • 新增功能时,工程量稍大

.


3.抽象工厂模式

3.1 抽象工厂模式

抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的。

抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象。

.

3.2 实现步骤

1.提供一个抽象工厂类:声明一组创建一族产品的工厂方法

2.提供一个具体工厂类:实现了在抽象工厂创建产品的工厂方法

3.提供一个抽象产品类:抽象产品中声明了产品具有的业务方法

4.提供一个具体产品类:实现抽象产品接口中声明的业务方法
在这里插入图片描述

.

3.3 实现代码

#include <iostream>
using namespace std;
//抽象产品
class Product 
{
public:
    virtual void show() = 0;
};
//抽象产品族1
class KeyBoard :public Product{};
//罗技键盘
class LogiKeyBoard :public KeyBoard
{
    void show()
    {
        cout << "罗技键盘......" << endl;
    }
};
//雷蛇键盘
class RazerKeyBoard :public KeyBoard
{
    void show() 
    {
        cout << "雷蛇键盘......" << endl;
    }
};
//抽象产品族2
class Mouse :public Product {};
//罗技鼠标
class LogiMouse :public Mouse
{
    void show() 
    {
        cout << "罗技鼠标......" << endl;
    }
};
class RazerMouse :public Mouse 
{
    void show() 
    {
        cout << "雷蛇鼠标......" << endl;
    }
};
//抽象工厂
class Factory
{
public:
    virtual KeyBoard* createKeyBoard() = 0;
    virtual Mouse* createMouse() = 0;
};
class LogiFactory :public Factory
{
    KeyBoard* createKeyBoard()
    {
        return new LogiKeyBoard;
    }
    Mouse* createMouse() 
    {
        return new LogiMouse;
    }
};
class RazerFactory :public Factory 
{
    KeyBoard* createKeyBoard() 
    {
        return new RazerKeyBoard;
    }
    Mouse* createMouse() 
    {
        return new RazerMouse;
    }
};

int main() 
{
    Factory* factory = new LogiFactory;
    KeyBoard* keyBoard = factory->createKeyBoard();
    Mouse* mouse = factory->createMouse();
    keyBoard->show();
    mouse->show();
    delete factory;
    delete keyBoard;
    delete mouse;
    factory = new RazerFactory;
    keyBoard = factory->createKeyBoard();
    mouse = factory->createMouse();
    keyBoard->show();
    mouse->show();
    delete factory;
    delete keyBoard;
    delete mouse;
    factory = NULL;
    keyBoard = NULL;
    mouse = NULL;
    return 0;
}

.

3.4 优缺点

优点

  • 抽象工厂封装了变化,封装了对象创建的具体细节

  • 增加新的产品族很方便,无须修改已有系统

  • 针对接口进行编程而不是针对具体进行编程

缺点:

  • 增加新的产品等级结构需对原系统做较大修改(违背开放封闭)

.


声明:资源可能存在第三方来源,若有侵权请联系删除!

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

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

相关文章

国产化Excel处理组件Spire.XLS教程:如何使用 C# 将 Excel(XLS 或 XLSX)文件转换为 PDF

Excel 是常见的数据处理与呈现工具&#xff0c;但直接共享 Excel 文件可能面临格式错乱、兼容性不足或数据泄露的风险。为了保证文档在不同平台和终端上的稳定展示&#xff0c;开发者常常需要将 Excel 文件转换为 PDF 格式。 本文将详细介绍如何使用 C#和.NET Excel 库——Spi…

B3623 枚举排列(递归实现排列型枚举)

B3623 枚举排列&#xff08;递归实现排列型枚举&#xff09; - 洛谷 题目描述 今有 n 名学生&#xff0c;要从中选出 k 人排成一列拍照。 请按字典序输出所有可能的排列方式。 输入格式 仅一行&#xff0c;两个正整数 n,k。 输出格式 若干行&#xff0c;每行 k 个正整数…

Fine Pruned Tiled Light Lists(精细删减的分块光照列表)

概括 在这篇文章&#xff0c; 我将介绍一种Tiled Light 变体&#xff0c;主要针对AMD Graphics Core Next&#xff08;GCN&#xff09;架构进行优化&#xff0c;我们的方法应用于游戏 古墓丽影:崛起 中&#xff0c;特别是我们在通过光列表生成和阴影贴图渲染之间交错进行异步计…

openresty+lua+redis把非正常访问的域名加入黑名单

一、验证lua geoIp2是否缺少依赖 1、执行命令 /usr/local/openresty/bin/opm get anjia0532/lua-resty-maxminddb 执行安装命令报错,缺少Digest/MD5依赖 2、Digest/MD5依赖 yum -y install perl-Digest-MD5 GeoIP2 lua库依赖动态库安装&#xff0c;lua库依赖libmaxminddb实…

使用Mathematica绘制随机多项式的根

使用ListPlot和NSolve直接绘制&#xff1a; (*返回系数为r和s之间整数的n次随机多项式*) eq[n_, r_, s_] : RandomInteger[{r, s}, {n}] . Array[Power[x, # - 1] &, n] (*返回给定随机多项式的根所对应的笛卡尔坐标*) sol[n_, r_, s_] : {Re[#], Im[#]} & / (x /.…

IEEE PRMVAI 2025 WS 26:计算机视觉前沿 Workshop 来袭!

宝子们&#xff0c;搞计算机视觉和深度学习的看过来啦&#xff01;&#x1f389; 2025 年 IEEE 第三届模式识别、机器视觉和人工智能国际会议里&#xff0c;Workshop 26 简直是科研宝藏地&#xff01; 这次 Workshop 聚焦 “Deep learning - based low - level models for comp…

360浏览器设置主题

设置默认主题&#xff1a; 1.右上角有个皮肤按钮 进来后&#xff0c;右边有个回复默认皮肤按钮。 换成彩色皮肤后&#xff0c;找按钮不太好找了。

最卸载器——Geek Uninstaller 使用指南

Geek Uninstaller 是一款轻量级的第三方卸载工具&#xff0c;专为 Windows 系统设计&#xff0c;提供比系统默认卸载器更彻底的应用清除能力。它体积小、绿色免安装&#xff0c;使用起来简单直观&#xff0c;但功能却不含糊。 一、为什么要用 Geek Uninstaller&#xff1f; Wi…

应急响应靶机-web3-知攻善防实验室

题目&#xff1a; 1.攻击者的两个IP地址 2.攻击者隐藏用户名称 3.三个攻击者留下的flag 密码&#xff1a;yj123456 解题&#xff1a; 1.攻击者的两个IP地址 一个可能是远程&#xff0c;D盾&#xff0c;404.php,192.168.75.129 找到远程连接相关的英文,1149代表远程连接成功…

【基于SpringBoot的图书购买系统】Redis中的数据以分页的形式展示:从配置到前后端交互的完整实现

引言 在当今互联网应用开发中&#xff0c;高性能和高并发已经成为系统设计的核心考量因素。Redis作为一款高性能的内存数据库&#xff0c;以其快速的读写速度、丰富的数据结构和灵活的扩展性&#xff0c;成为解决系统缓存、高并发访问等场景的首选技术之一。在图书管理系统中&…

Jupyter MCP服务器部署实战:AI模型与Python环境无缝集成教程

Jupyter MCP 服务器是基于模型上下文协议&#xff08;Model Context Protocol, MCP&#xff09;的 Jupyter 环境扩展组件&#xff0c;它能够实现大型语言模型与实时编码会话的无缝集成。该服务器通过标准化的协议接口&#xff0c;使 AI 模型能够安全地访问和操作 Jupyter 的核心…

PMO价值重构:从项目管理“交付机器”到“战略推手”

在数字化转型浪潮中&#xff0c;项目管理办公室&#xff08;PMO&#xff09;正经历着前所未有的角色蜕变。传统上&#xff0c;PMO往往被视为项目管理的“交付机器”&#xff0c;专注于项目的按时交付和资源分配。然而&#xff0c;随着企业对战略执行的重视&#xff0c;PMO正逐渐…

零知开源——STM32F407VET6驱动Flappy Bird游戏教程

简介 本教程使用STM32F407VET6零知增强板驱动3.5寸TFT触摸屏实现经典Flappy Bird游戏。通过触摸屏控制小鸟跳跃&#xff0c;躲避障碍物柱体&#xff0c;挑战最高分。项目涉及STM32底层驱动、图形库移植、触摸控制和游戏逻辑设计。 目录 简介 一、硬件准备 二、软件架构 三、…

力扣HOT100之动态规划:300. 最长递增子序列

这道题之前刷代码随想录的时候也刷过&#xff0c;现在又给忘完了。自己尝试着写了一下&#xff0c;发现怎么写都写不对&#xff0c;直接去看视频了。。我自己写的时候的定义是&#xff1a;考虑下标0 ~ i范围内索赔能取到的最长严格递增子序列的长度&#xff0c;后面发现在写递推…

在win10/11下Node.js安装配置教程

下载安装 官网链接https://nodejs.org/zh-cn 下载好以后双击打开&#xff0c;点击下一步 勾选&#xff0c;然后下一步 选择路径、下一步 下一步 配置环境 找到我们安装的文件夹&#xff0c;创建两个文件夹 node_global node_cache 在CMD中配置路径 npm config set p…

飞致云开源社区月度动态报告(2025年5月)

自2023年6月起&#xff0c;中国领先的开源软件公司飞致云以月度为单位发布《飞致云开源社区月度动态报告》&#xff0c;旨在向广大社区用户同步飞致云旗下系列开源软件的发展情况&#xff0c;以及当月主要的产品新版本发布、社区运营成果等相关信息。 飞致云开源运营数据概览&…

压缩包方式在Linux和Windows下安装mongodb

目录 安装流程安装实例1. Linux安装2. Windows安装 总结 安装流程 zip方式安装 优点&#xff1a;自定义性较高&#xff0c;可以自己控制数据、日志等文件的位置 1、下载安装包 2、解压安装包 3、创建各类文件路径 4、配置conf文件 5、使用自定义配置文件启动 安装实例 1. Li…

智慧场馆:科技赋能的艺术盛宴

智慧场馆作为城市公共服务设施数字化转型的典型代表&#xff0c;通过深度融合新一代信息技术&#xff0c;构建起全方位、智能化的运营管理体系。其功能架构不仅提升了场馆本身的运营效能&#xff0c;更重塑了公共服务体验模式&#xff0c;展现出显著的社会价值和商业潜力。 一…

《ChatGPT o3抗命:AI失控警钟还是成长阵痛?》

ChatGPT o3 “抗命” 事件起底 在人工智能的飞速发展进程中&#xff0c;OpenAI 于 2025 年推出的 ChatGPT o3 推理模型&#xff0c;犹如一颗重磅炸弹投入了技术的海洋&#xff0c;激起千层浪。它被视为 “推理模型” 系列的巅峰之作&#xff0c;承载着赋予 ChatGPT 更强大问题解…

【sa-token】 sa-token非 web 上下文无法获取 HttpServletRequest。

Springboot cloud gateway集成sa-token中报错 cn.dev33.satoken.exception.NotWebContextException: 非 web 上下文无法获取 HttpServletRequestat cn.dev33.satoken.spring.SpringMVCUtil.getRequest(SpringMVCUtil.java:45) ~[sa-token-spring-boot-starter-1.38.0.jar:?]官…