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

大话设计模式之简单工厂模式

简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,属于工厂模式的一种。在简单工厂模式中,有一个工厂类负责根据输入参数的不同来创建不同类的实例。

简单工厂模式包含以下几个要素:
1. **工厂类(Factory Class)**:工厂类包含一个方法,根据传入的参数动态地创建并返回不同类的实例。
   
2. **产品接口(Product Interface)**:产品接口是被创建的对象所共享的接口或抽象类。

3. **具体产品类(Concrete Product Classes)**:具体产品类是实现产品接口的具体类,由工厂类根据条件创建。

简单工厂模式的优点包括:
- 将对象创建和业务逻辑分离,客户端只需要知道工厂类即可,不需要关心具体的实现细节。
- 容易扩展,如果需要添加新的产品类,只需修改工厂类即可,符合开闭原则。

然而,简单工厂模式也有缺点,最主要的是当产品类较多时,工厂类会变得庞大且难以维护,违反了单一职责原则。

总的来说,简单工厂模式适合于需要创建的对象较少且不频繁变化的情况下使用,能够有效地封装对象的创建过程。

#include <iostream>
#include <memory>// 产品接口
class Product {
public:virtual void operation() = 0;
};// 具体产品类A
class ConcreteProductA : public Product {
public:void operation() override {std::cout << "Product A operation" << std::endl;}
};// 具体产品类B
class ConcreteProductB : public Product {
public:void operation() override {std::cout << "Product B operation" << std::endl;}
};// 简单工厂类
class SimpleFactory {
public:Product *createProduct(int type){switch (type) {case 1:return new ConcreteProductA;case 2:return new ConcreteProductB;default:return nullptr;}}
};int main(int argc, char *argv[])
{SimpleFactory factory;// 创建产品AProduct *productA = factory.createProduct(1);productA->operation();// 创建产品BProduct *productB = factory.createProduct(2);productB->operation();return 0;
}/*
在这个例程中,我们定义了一个产品接口 Product,并实现了两个具体产品类 ConcreteProductA 和 ConcreteProductB。然后,我们创建了一个简单工厂类 SimpleFactory,其中包含了根据输入参数创建不同产品对象的方法。在 main 函数中,我们使用简单工厂来创建不同类型的产品对象并调用其方法进行操作。
*/

觉得有帮助的话,打赏一下呗。。

           

相关文章:

  • stm32之GPIO寄存器
  • 【Hexo + Github 搭建自己的专属博客】
  • Itextpdf电子签章
  • 数据库系统概论(超详解!!!) 第四节 关系数据库标准语言SQL(Ⅱ)
  • 【MySQL】数据库--表操作
  • android pdf框架-10,相册浏览
  • flutter 修改app名字和图标
  • FPGA时钟资源详解(4)——区域时钟资源
  • Redis部署中的问题总汇
  • 【ansible】Failed to connect to the host via ssh Permission denied
  • Python中模块
  • 让IIS支持.NET Web Api PUT和DELETE请求
  • 《web应用技术》第一次课后练习
  • 【热门话题】Yarn:新一代JavaScript包管理器的安装与使用
  • 网络七层模型之数据链路层:理解网络通信的架构(二)
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • [deviceone开发]-do_Webview的基本示例
  • __proto__ 和 prototype的关系
  • 4个实用的微服务测试策略
  • Invalidate和postInvalidate的区别
  • MySQL几个简单SQL的优化
  • mysql中InnoDB引擎中页的概念
  • PHP 小技巧
  • Sass 快速入门教程
  • SpringCloud集成分布式事务LCN (一)
  • 关于Flux,Vuex,Redux的思考
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 蓝海存储开关机注意事项总结
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 全栈开发——Linux
  • 如何选择开源的机器学习框架?
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 学习笔记TF060:图像语音结合,看图说话
  • ​configparser --- 配置文件解析器​
  • #Spring-boot高级
  • $(selector).each()和$.each()的区别
  • (2022 CVPR) Unbiased Teacher v2
  • (4)(4.6) Triducer
  • (C#)获取字符编码的类
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (第27天)Oracle 数据泵转换分区表
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (四)c52学习之旅-流水LED灯
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (转)视频码率,帧率和分辨率的联系与区别
  • (转)详解PHP处理密码的几种方式
  • .net FrameWork简介,数组,枚举
  • .Net Web项目创建比较不错的参考文章
  • .Net 路由处理厉害了
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .NetCore项目nginx发布
  • .NET序列化 serializable,反序列化
  • .py文件应该怎样打开?