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

设计模式---简单工厂模式

简单工厂模式(Simple Factory Pattern) 是一种创建型设计模式,它定义了一个工厂类,通过这个工厂类可以创建不同类型的对象。简单工厂模式的主要目的是将对象的创建逻辑集中在一个地方,简化客户端的代码,使得客户端不需要直接实例化具体的类。

简单工厂模式的核心要素:

  1. Product(产品接口):定义了工厂方法所创建的对象的接口。
  2. ConcreteProduct(具体产品):实现了 Product 接口的具体类。
  3. Factory(工厂):提供一个静态方法来创建 Product 对象的实例。

示例:创建不同类型的 Shape 对象

我们将使用简单工厂模式来创建不同类型的 Shape 对象,例如 CircleRectangle

1. 定义 Shape 类(产品接口)
#include <iostream>// Product interface
class Shape {
public:virtual ~Shape() = default;virtual void draw() const = 0;
};

2. 定义 ConcreteProduct 类(具体产品)

// ConcreteProduct 1
class Circle : public Shape {
public:void draw() const override {std::cout << "Drawing a circle." << std::endl;}
};// ConcreteProduct 2
class Rectangle : public Shape {
public:void draw() const override {std::cout << "Drawing a rectangle." << std::endl;}
};

3. 定义 Factory 类(工厂)

#include <string>// Factory
class ShapeFactory {
public:static Shape* createShape(const std::string& type) {if (type == "Circle") {return new Circle();} else if (type == "Rectangle") {return new Rectangle();} else {return nullptr;}}
};

4. 使用简单工厂模式

int main() {// 使用工厂创建不同类型的 Shape 对象Shape* shape1 = ShapeFactory::createShape("Circle");Shape* shape2 = ShapeFactory::createShape("Rectangle");// 调用方法if (shape1) {shape1->draw();}if (shape2) {shape2->draw();}// 清理资源delete shape1;delete shape2;return 0;
}

解释

  1. Shape 类是产品接口,定义了所有具体产品必须实现的方法 draw
  2. CircleRectangle 类是具体产品,它们实现了 Shape 接口的 draw 方法。
  3. ShapeFactory 类是工厂,提供一个静态方法 createShape,根据传入的类型参数创建不同的 Shape 对象。这种方法将对象创建的逻辑集中在工厂类中,简化了客户端的代码。
  4. main 函数 中,通过工厂方法创建 Shape 对象,并调用其 draw 方法进行演示。

简单工厂模式的优点在于它将对象创建的逻辑集中到工厂类中,使得客户端代码变得更简单、更清晰。然而,简单工厂模式也有局限性,例如它违反了开闭原则(即添加新产品时需要修改工厂代码)。在需要扩展产品类型时,可以考虑使用工厂方法模式或抽象工厂模式等更灵活的设计模式。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Bazaar v1.4.3 任意文件读取漏洞复现(CVE-2024-40348)
  • 【C++ 面试 - 基础题】每日 3 题(十五)
  • PostgreSQL-02-入门篇-查询数据
  • 《全面解析 Nginx:从下载安装到高级应用与问题解决》
  • Linux 操作系统 --- 信号
  • 【项目】基于Vue2+Router+Vant 前端面经项目
  • 你知道Windows下的linux的神器WSL吗?
  • 【VRPCB】Python+Gurobi求解运输问题建模实践三
  • 景联文科技:图像标注的类型有哪些?
  • 【网络安全】SSO登录过程实现账户接管
  • 【网络通信】关于TCP和HTTP
  • 【MybatisPlus】创建Mapper接口继承BaseMapper接口
  • Linux 与 Windows 服务器操作系统 | 全面对比
  • 什么是DevUI?
  • 美股收涨,半导体板块领涨;苹果iPhone出货预测上调
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • Apache Zeppelin在Apache Trafodion上的可视化
  • css系列之关于字体的事
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • js操作时间(持续更新)
  • mongodb--安装和初步使用教程
  • Vue2.x学习三:事件处理生命周期钩子
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 通过npm或yarn自动生成vue组件
  • 我从编程教室毕业
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 责任链模式的两种实现
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • # 利刃出鞘_Tomcat 核心原理解析(七)
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #传输# #传输数据判断#
  • (6)设计一个TimeMap
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (接上一篇)前端弄一个变量实现点击次数在前端页面实时更新
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (转)项目管理杂谈-我所期望的新人
  • (轉貼) UML中文FAQ (OO) (UML)
  • .CSS-hover 的解释
  • .net 4.0发布后不能正常显示图片问题
  • .Net 6.0--通用帮助类--FileHelper
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .net wcf memory gates checking failed
  • .NET 反射 Reflect
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .NET8 动态添加定时任务(CRON Expression, Whatever)
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • /dev/sda2 is mounted; will not make a filesystem here!
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
  • [ Linux ] Linux信号概述 信号的产生
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)
  • [22]. 括号生成
  • [AI aider] 打造终端AI搭档:Aider让编程更智能更有趣!