简单工厂模式

article/2025/6/21 14:45:18

简单工厂模式(Simple Factory Pattern)

简单工厂模式(又称静态工厂模式)是一种创建型设计模式,它通过一个工厂类来封装对象的创建逻辑,客户端无需直接实例化具体类,而是通过工厂类获取所需对象。

1.类图结构

简单工厂类图

2.关键角色

角色说明
Client客户端,一个或多个,调用SimpleFactorycreateProduct()创建Product
SimpleFactory工厂类,根据Client的输入创建具体的 Product
Product抽象产品,定义产品行为,可以是抽象类或接口类,取决于实际场景
ConcreteProductA ConcreteProductB具体产品,继承或实现 Product

3. 代码示例

3.1 定义抽象产品

// 抽象形状类
class IShape 
{
public:virtual ~IShape()            = default;virtual double area() const = 0;virtual void   draw() const = 0;
};

3.2 定义具体产品

// 具体形状类 - 圆形
constexpr double M_PI = 3.14;
class Circle : public IShape 
{
public:explicit Circle(std::initializer_list<double> args) {if (args.size() == 1) {auto iter = args.begin();radius    = *iter;}if (radius <= 0) {throw std::invalid_argument("Circle radius must be positive");}}double area() const override {return M_PI * radius * radius;}void draw() const override {std::cout << "Drawing a circle with radius " << radius<< " and area " << area() << std::endl;}private:double radius;
};// 具体形状类 - 矩形
class Rectangle : public IShape
{
public:Rectangle(double w, double h) : width(w), height(h) {}Rectangle(std::initializer_list<double> args){if (args.size() == 2){auto iter = args.begin();width     = *iter++;height    = *iter;}if (width <= 0 || height <= 0)throw std::invalid_argument("Rectangle dimensions must be positive");}double area() const override {return width * height;}void draw() const override {std::cout << "Drawing a rectangle " << width << "x" << height<< " with area " << area() << std::endl;}private:double width, height;
};// 具体形状类 - 三角形
class Triangle : public IShape 
{
public:Triangle(std::initializer_list<double> args){if (args.size() == 3) {auto iter = args.begin();a         = *iter++;b         = *iter++;c         = *iter;}// 验证是否为有效三角形if (a + b <= c || a + c <= b || b + c <= a) {throw std::invalid_argument("Invalid triangle sides");}}double area() const override {// 使用海伦公式计算面积double s = (a + b + c) / 2;return sqrt(s * (s - a) * (s - b) * (s - c));}void draw() const override {std::cout << "Drawing a triangle with sides " << a << ", " << b << ", " << c<< " and area " << area() << std::endl;}private:double a, b, c;
};

3.3 定义简单工厂

// 形状工厂类
class ShapeFactory 
{
public:static std::unique_ptr<IShape> createShape(const std::string& type, std::initializer_list<double> args){if (type == "circle")return std::make_unique<Circle>(args);else if (type == "rectangle")return std::make_unique<Rectangle>(args);else if (type == "triangle")return std::make_unique<Triangle>(args);throw std::invalid_argument("Unknown shape type: " + type);}
};

3.4 客户端调用

#include <cmath>
#include <iostream>
#include <memory>
#include <stdexcept>
#include <string>int main() 
{try {// 创建圆形auto circle = ShapeFactory::createShape("circle", {5.0});circle->draw();// 创建矩形auto rectangle = ShapeFactory::createShape("rectangle", { 4.0, 6.0 });rectangle->draw();// 创建三角形auto triangle = ShapeFactory::createShape("triangle", { 3.0, 4.0, 5.0 });triangle->draw();// 尝试创建无效形状会抛出异常auto invalidCircle = ShapeFactory::createShape("circle", {-1.0});auto invalidTriangle = ShapeFactory::createShape("triangle", {1.0, 2.0, 5.0});} catch (const std::exception& e) {std::cerr << "Error: " << e.what() << std::endl;}return 1;
}

4. 特点

✅ 优点

  • 解耦:客户端不直接依赖具体产品类,只依赖 Product 接口和 SimpleFactory
  • 职责分离:对象的创建逻辑集中在工厂类中,当有多个客户端时,仅需要修改工厂类代码。
  • 简单易用:适用于产品种类较少、变化不频繁的场景。

❌ 缺点

  • 违反开闭原则(OCP):新增产品类型时,必须修改 SimpleFactory 的逻辑(增加 if-else 分支)。
  • 工厂类职责过重:如果产品种类很多,工厂方法会变得臃肿。

4. 对比其他工厂模式

模式特点适用场景
简单工厂一个工厂类,通过 if-else 创建不同产品产品种类少,变化少
工厂方法每个产品对应一个工厂,符合开闭原则产品种类多,可能扩展
抽象工厂生产多个产品族(如不同风格的UI组件)需要创建一组相关对象

5. 适用场景

  • 对象的创建逻辑较简单,且不会频繁变化。
  • 客户端不需要关心具体实现类,只需获取产品实例。
  • 适用于小型项目或工具类,如:
    • 数据库驱动加载(DriverManager.getConnection()
    • 日志记录器(LoggerFactory.getLogger()

6. 变体:静态工厂方法

如果工厂方法定义为 static,则称为静态工厂(如 SimpleFactory::createProduct())。
优点:无需实例化工厂类,直接调用。
缺点:无法通过继承改变创建方法的逻辑。

7. 总结

  • 简单工厂 = 一个工厂类 + 条件判断创建对象
  • 适合简单场景,但不适合复杂或可扩展的系统
  • 如果需求可能变化,建议改用工厂方法或抽象工厂

http://www.hkcw.cn/article/uKYuHSWnNX.shtml

相关文章

司机回应冲入起火麦地抢收 救人救麦两不误

司机回应冲入起火麦地抢收 救人救麦两不误!6月1日,一段“男子开收割机冲入起火麦地抢收”的视频在网上引起广泛关注。视频中,不远处的麦田里浓烟滚滚,多处燃起火焰,火势借风力不断蔓延。这时,一台收割机朝着浓烟方向驶去,快速在麦田中开辟出一条隔火带。视频中,收割机司…

肖战遇强则强的表演张力 藏海复仇之路燃爆演技

肖战遇强则强的表演张力 藏海复仇之路燃爆演技。《藏海传》开篇即是一场灭门惨案,复仇之路充满荆棘,所遇之人可能皆为利用,真假难辨。肖战在剧中展现了细腻的演技,完美呈现了角色复杂的内心世界。从复仇少年到心怀天下的成长过程极具张力,在肖战的演绎下,观众可以看到藏海…

韩国大选最早明天凌晨有结果 五位候选人角逐总统

韩国第21届总统大选投票于6月3日6时正式开始,全国共设有14295个投票站。未参与提前投票的选民可凭身份证件前往指定投票站进行投票,投票将于当天20时结束。本次大选共有7位候选人登记参选,但其中两位先后宣布退出并支持国民力量党候选人金文洙,因此最终有5位候选人角逐总统…

小米YU7不开门亮相车展 观众排长龙 现象级热度引发关注

小米YU7不开门亮相车展 观众排长龙 现象级热度引发关注!2025年粤港澳大湾区车展上,小米汽车的展位异常热闹。6号馆06展位前,从早到晚都排着长队,不少观众顶着深圳三十五度的烈日等待,只为亲眼看看那台传说中“吊打Model Y”的小米YU7。有位带着孩子的宝妈在采访中说:“本…

【数据集】不同情景下全球城市扩张(2050年)

目录 数据概述数据输入模型架构数据下载参考数据概述 论文-J2019-Projecting global urban land expansion and heat island intensification through 2050 数据输入 使用了四个数据源:来自全球人类住区层的城市土地范围(Pesaresi等人,2013年)、来自联合国的城市人口(联合…

华为IPD流程研学:162页 华为研发IPD管理流程详解【附全文阅读】

该文档围绕华为研发 IPD 管理流程展开&#xff0c;核心是通过集成产品开发&#xff08;IPD&#xff09;体系优化产品开发全流程。首先介绍需求管理流程&#xff08;OR&#xff09;&#xff0c;强调统一需求收集与管理以提升交付质量&#xff1b;市场管理流程&#xff08;MM&…

三步锁定光储融合黄金配置

你是否遇到过这样的场景&#xff1f;花百万装光伏&#xff0c;结果因阴影遮挡发电量比预期少20%&#xff1b;配了储能却没赚到峰谷价差&#xff0c;反而因容量过剩多花30万…… 传统光储规划就像蒙眼开车&#xff0c;而光储模拟系统正在改变这一切。 一、多维度参数配置 1.量身…

多租户系统的实现方式

多租户系统的实现方式 一、多租户架构概述 多租户&#xff08;Multi-Tenancy&#xff09;是SaaS&#xff08;软件即服务&#xff09;模式的核心架构技术&#xff0c;允许多个租户&#xff08;客户/组织&#xff09;共享同一软件实例&#xff0c;同时保证数据隔离和安全。其核…

Sui 中文社区月度激励计划

为了进一步激发开发者的热情&#xff0c;推动Sui开源项目的进步&#xff0c;HOH 特别推出了 Sui开源激励计划&#xff0c;鼓励更多的开发者参与 &#x1fa75; &#x1f3af; 无论是刚刚起步的新手&#xff0c;还是经验丰富的资深开发者&#xff0c;都可以积极参与&#xff0c…

Java反射(黑马)

Java反射&#xff08;Reflection&#xff09;是Java语言的一个强大特性&#xff0c;它允许程序在运行时动态地检查和操作类、接口、字段和方法。通过反射&#xff0c;程序可以获取类的信息、创建对象、调用方法、访问字段等&#xff0c;而无需在编译时知道这些类的具体实现。这…

教育部开通2025高考举报电话 欢迎举报问题线索

近日,教育部公布了2025年高考举报电话,覆盖教育部及各省(区、市)。欢迎广大考生、家长和社会各界人士举报涉及2025年高考的问题线索。相关部门将根据举报线索迅速核查处理,坚决维护高考的公平公正。责任编辑:zhangxiaohua

揭秘绿发会与蒋雨融父亲关联 家庭背景引争议

近日,蒋雨融因在哈佛大学2025年毕业典礼上的发言和家庭背景引发争议。2022年3月,绿发会曾公开发布推文称,时任副理事长兼秘书长的周晋峰推荐了长期志愿者蒋雨融进入哈佛大学肯尼迪学院,蒋雨融的父亲蒋志明对此表示感谢。目前,在绿发会的公众号和微博账号搜索“蒋雨融”,均…

Alist Win 基本用法

1&#xff1a;Alist 简介 Alist 是一个支持多种存储的文件列表程序&#xff0c;具体使用方式可参考 https://alistgo.com/zh/。 使用指南&#xff1a;https://alistgo.com/zh/guide/ 配置指南&#xff1a;https://alistgo.com/zh/config/ 2&#xff1a;Alist 部署 2.1&…

YOLOv10改进|爆改模型|涨点|C2F引入空间和通道注意力模块暴力涨点(附代码+修改教程)

一、文本介绍 本文修改的模型是YOLOv10&#xff0c;YOLOv10无需非极大值抑制&#xff08;NMS&#xff09;进行后处理&#xff0c;其推理速度以及参数量上都优于现有的模型。C2f (Cross-Stage Partial-Connection with 2 convolutions) 模块是YOLOv6中引入的一种结构&#xff0…

38岁男子酒后拖拽6岁女童进巷被拘 警方迅速行动控制嫌疑人

警情通报2025年5月20日下午,嫌疑人刘某某(男,38岁)酒后行至娄底市娄星区涟滨中街附近,拖拽一名6岁女童进入居民区巷子,被居民及时制止并报警。接警后,民警迅速赶到现场将刘某某控制。经侦查,刘某某涉嫌寻衅滋事已被拘留,并将依法追究其刑事责任。公安机关坚决依法打击…

隔离防护产品防晒有效果吗 选购需谨慎

夏日来临,防晒化妆品迎来销售高峰。不少商家打出“防护+修复”的宣传口号,声称产品既能防晒,又能美白修复。然而,消费者购买使用后却发现,这些所谓“多效合一”的产品,其实很多都只是普通的化妆品。在北京多家日化用品销售店,防晒霜、防晒喷雾等产品被摆在最显眼的位置。…

俄将向乌移交6000具阵亡士兵遗体 谈判达成一致

俄罗斯与乌克兰两国代表团于6月2日在土耳其伊斯坦布尔进行了第二轮直接谈判。双方就交换阵亡士兵遗体及新一轮换俘达成一致。谈判持续了约1小时,俄罗斯总统助理、俄方谈判代表团团长梅金斯基表示,俄方将在下周单方面向乌方移交6000具阵亡士兵遗体。梅金斯基还提到,俄乌将成立…

计算机视觉---深度学习框架(Backbone、Neck、Head)

一、主干&#xff08;Backbone&#xff09;&#xff1a;视觉特征的“根基” 1. 核心定位与功能 定义&#xff1a; 作为网络的底层基础&#xff0c;主干负责从输入图像中提取多层次、多尺度的视觉特征&#xff0c;其输出的特征图&#xff08;Feature Map&#xff09;需兼顾空间…

使用Cursor自动创建Dify工作流

一、背景 AI时代&#xff0c;使用自然语言进行编程&#xff0c;让开发变成聊天一样容易。提升我们的效率&#xff0c;复杂的、重复性的工作交给AI 工具来做&#xff0c;本次尝试使用cursor自动创建dify工作流。 二、准备工作&#xff1a; 本地安装Cursor开发工具&#xff08…

泡泡玛特续创新高 市值突破3100亿港元

泡泡玛特(9992.HK)股价继续走强,盘中一度上涨2.43%,达到235.6港元,创下历史新高,市值突破3100亿港元。今年以来,该股累计涨幅超过160%。摩根大通发布报告表示,对中国IP产业的乐观前景更加有信心,将泡泡玛特列为首选之一,并给予“增持”评级。尽管大多数企业尚未见到显…