当前位置: 首页 > news >正文

【C++】简单工厂模式

2023年12月6日,周三下午

今天又学习了一次简单工厂模式

每多学习一次,都会加深对设计模式的理解


目录

  • 什么是简单工厂模式
  • 简单工厂模式的优缺点
  • 举例说明

什么是简单工厂模式

简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,它提供了一种通过使用一个共同的接口来创建不同类型对象的方法。

在简单工厂模式中,有一个工厂类负责创建对象,而不是直接在客户端代码中实例化对象。客户端只需要通过向工厂类发送请求,并传递相应的参数,工厂类就会根据参数的不同来创建具体的对象。

简单工厂模式包含以下几个角色:

  • 工厂类(Factory Class):负责根据客户端的请求创建对象,并将对象返回给客户端。
  • 抽象产品类(Abstract Product Class):定义了产品的共同接口,用于描述具体产品类的共同特征。
  • 具体产品类(Concrete Product Class):实现了抽象产品类的接口,具体产品类是由工厂类创建的对象。

简单工厂模式的优缺点

简单工厂模式的优势在于将对象的创建和使用进行了分离,客户端只需要关心如何使用对象,而无需关心对象的创建过程。这样可以降低代码的耦合性,并提供了一定的灵活性,如果需要新增或修改产品,只需要修改工厂类即可。

然而,简单工厂模式也有一些限制。例如,当需要创建的产品类型较多时,工厂类的代码会变得复杂,违反了开闭原则。此外,简单工厂模式也无法满足创建对象的变化需求,需要借助其他的创建型设计模式,如工厂方法模式或抽象工厂模式。

举例说明

#include <iostream>// 抽象产品类
class Shape {
public:virtual void draw() = 0;
};// 具体产品类:圆形
class Circle : public Shape {
public:void draw() override {std::cout << "Draw a circle." << std::endl;}
};// 具体产品类:矩形
class Rectangle : public Shape {
public:void draw() override {std::cout << "Draw a rectangle." << std::endl;}
};// 工厂类
class ShapeFactory {
public:// 创建具体产品对象的方法Shape* createShape(const std::string& type) {if (type == "circle") {return new Circle();} else if (type == "rectangle") {return new Rectangle();} else {return nullptr; // 可以根据实际情况返回默认的或者异常处理}}
};int main() {ShapeFactory factory;Shape* shape1 = factory.createShape("circle");shape1->draw();  // 输出:Draw a circle.Shape* shape2 = factory.createShape("rectangle");shape2->draw();  // 输出:Draw a rectangle.return 0;
}

相关文章:

  • C++STL的string(超详解)
  • 大量 SVG 图标在 React 中的极速集成与应用
  • MySQL概述-安装与启动
  • P1317 低洼地题解
  • 【Flutter】vs2022上开发flutter
  • 免费的SEO外链发布工具,提升排名的利器
  • 63. 不同路径 II
  • 二叉搜索树中第K小的元素[中等]
  • unittest与pytest的区别
  • 【已解决】解决UbuntuKali无法进行SSH远程连接
  • 理解基于 Hadoop 生态的大数据技术架构
  • k8s 安装部署
  • OWASP安全练习靶场juice shop-更新中
  • 【基于ESP32无线蓝牙上传电脑Excel透传数据】
  • [Ubuntu 20.04] 使用Netplan配置网络静态IP
  • Apache Spark Streaming 使用实例
  • CSS居中完全指南——构建CSS居中决策树
  • flask接收请求并推入栈
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • jquery cookie
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • opencv python Meanshift 和 Camshift
  • python docx文档转html页面
  • SpiderData 2019年2月25日 DApp数据排行榜
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 编写符合Python风格的对象
  • 看域名解析域名安全对SEO的影响
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 如何解决微信端直接跳WAP端
  • 一个完整Java Web项目背后的密码
  • 06-01 点餐小程序前台界面搭建
  • linux 淘宝开源监控工具tsar
  • 组复制官方翻译九、Group Replication Technical Details
  • ​数据结构之初始二叉树(3)
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (Java)【深基9.例1】选举学生会
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (黑马点评)二、短信登录功能实现
  • (三十五)大数据实战——Superset可视化平台搭建
  • (十八)三元表达式和列表解析
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (一)Neo4j下载安装以及初次使用
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转)jQuery 基础
  • (转)Linq学习笔记
  • .apk 成为历史!
  • .NET MAUI Sqlite程序应用-数据库配置(一)
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • .NET下的多线程编程—1-线程机制概述
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • [7] CUDA之常量内存与纹理内存
  • [BPU部署教程] 教你搞定YOLOV5部署 (版本: 6.2)