简单工厂模式 - 实践

news/2025/10/7 12:50:39/文章来源:https://www.cnblogs.com/wzzkaifa/p/19128372

简单工厂模式(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);elseif (type == "rectangle")return std::make_unique<Rectangle>(args);elseif (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. 特点

✅ 优点


❌ 缺点


4. 对比其他工厂模式

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

5. 适用场景

6. 变体:静态工厂方法

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

7. 总结

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

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

相关文章

1.springmvc基础入门(一) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

爱,在行动中生长,我们因爱而变得辽阔——《岛上书店》读后感

看完了《岛上书店》,合上书最想说的就是:这书真好看。不是那种需要正襟危坐才能读下去的“大作”,更像是在一个闲适的下午,听朋友娓娓道来一个发生在小岛上的,关于一群普通人如何因为书与爱而彼此牵连的故事。 全…

杭州做商务网站网站建设企业实践总结

Windows Server 2012学习 用windows系统来架构网络&#xff0c;以便将资源共享给网络上的用户。 windows的网络架构大致可以分为工作组&#xff08;workgroup&#xff09;架构&#xff0c;域&#xff08;domain&#xff09;架构与前两者的混合架构。 一、工作组架构为分布式…

做网站的流程视频教程网站开发设计课程

题目 读入一个正整数 n&#xff0c;计算其各位数字之和&#xff0c;用汉语拼音写出和的每一位数字。 输入格式&#xff1a; 每个测试输入包含 1 个测试用例&#xff0c;即给出自然数 n 的值。这里保证 n 小于 10 ​100。 输出格式&#xff1a; 在一行内输出 n 的各位数字之和…

东营免费建网站幼儿活动设计方案模板

一、关于效率和适用范围 尽管官方承诺Json格式字段采用了空间换时间的策略&#xff0c;比Text类型来存储Json有大幅度的效率提升。但是Json格式的处理过程仍然效率不及传统关系表&#xff0c;所以什么时候用Json格式字段尤为重要。 只有我们确定系统已经能精确定位到某一行&am…

做一个网站 如何盈利制作网站源码软件

前言 最近在做项目过程中,我们注意到当考虑车体轮廓去进行全局路径规划(如混合A*算法),如果仅仅将障碍物点云数据中得每一个点只当成点,会造成较大的计算时间,如若将点云聚类成圆形 线型 多边形障碍物 会提高计算效率,这是其中一个原因,另一个原因是,我们需要知道障碍…

Ubuntu 下同名文件替换后编译链接到旧内容的现象分析 - 实践

Ubuntu 下同名文件替换后编译链接到旧内容的现象分析 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Conso…

Luogu P14007 「florr IO Round 1」查询游戏 题解 [ 蓝 ] [ 交互 ]

查询游戏 原题做法是显然的,子段绝对值最大值可以转化为求出前缀和序列的最大值、最小值,然后两者作差即可。查询操作可以转化为询问前缀和序列中两个元素比大小。因为查询数 \(2n\),所以各扫一遍用擂台法求最大、最…

RK3588和FPGA桥片之间IO电平信号概率性不能通信原因 - 实践

RK3588和FPGA桥片之间IO电平信号概率性不能通信原因 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consol…

稀缺计算资源如何塑造机器学习优化专家

本文讲述了机器学习专家如何在有限计算资源条件下发展优化技能,重点介绍了特征选择技术在高维空间中的应用,以及如何将这些技术应用于保护电商平台安全的实际场景中。稀缺计算资源如何塑造卡洛斯韦尔塔斯的职业生涯 …

医院建设网站意义电子商务网站首页设计

Project下要创建四个文件夹: bin(输出目录\工作目录) 、include(头文件目录) 、lib(动态库目录) 、src(源码目录) 一、主项目模块配置&#xff1a; 1.配置属性——>常规——>输出目录加入(..\..\bin\) 2.配置属性——>调试——>工作目录加入($(OutDir)) 备注&am…

优雅的合并GIT分支

优雅的合并GIT分支 目标 将dev​分支合并到main分支,并且不产生“合并提交”。具体操作确保本地 main 分支是最新的: bash git checkout main git pull origin main # 获取远程最新的main分支代码切换到 dev​ 分支…

实用指南:豆瓣图书评论数据分析与可视化

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

cpa广告联盟网站建设高端网站开发平台

文章目录 标准化与池化1. 标准化/归一化1.1 归一化归一化的作用 1.2 标准化批标准化方法 Batch Normailzation标准化方法的对比自动学习标准化方法 2. 池化2.1 池化的作用2.2 常见的池化方法2.3 池化方法的差异2.4 池化的必要性 标准化与池化 1. 标准化/归一化 1.1 归一化 归…

网站开发的核心技术上海装修公司招聘施工队长

概述 jQuery 是继 prototype 之后又一个优秀的 Javascript 框架。其宗旨是—写更少的代码,做更多的事情。它是轻量级的 js 库(压缩后只有21k) &#xff0c;这是其它的 js 库所不及的&#xff0c;它兼容 CSS3&#xff0c;还兼容各种浏览器&#xff08;IE 6.0, FF 1.5, Safari 2.…

网站怎么做电脑系统下载wordpress文章表情插件

每个进程都有三个标准文件描述符&#xff1a;stdin&#xff08;标准输入&#xff09;、stdout&#xff08;标准输出&#xff09;和stderr&#xff08;标准错误&#xff09;。默认情况下&#xff0c;stderr会输出到终端。使用2>可以将stderr重定向到其他地方&#xff0c;比如…

广州市番禺区官网seo站群干什么的

题目 题目链接 分析 这道题目一定要多读几遍&#xff0c;才能理解。 大意就是你有钱budget 和 库存stock的金属零件&#xff0c;让你从一堆机器里面选择一种机器可以合成最多金属的数量是多少&#xff0c;这些机器合成金属需要的零件数目是不一样的&#xff0c;composition…

网站手机客户端在线制作北京知名网站

本文节介绍 PP-TSM 模型如何转化为 ONNX 模型&#xff0c;并基于 ONNX 引擎预测。 1&#xff1a;环境准备 安装 Paddle2ONNX python -m pip install paddle2onnx 安装 ONNXRuntime # 建议安装 1.9.0 版本&#xff0c;可根据环境更换版本号 python -m pip install onnxrunti…

完整教程:Excel to JSON 插件 2.4.0 版本更新

完整教程:Excel to JSON 插件 2.4.0 版本更新pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &q…

Ai元人文:人文逻辑与规则逻辑的统一

Ai元人文:人文逻辑与规则逻辑的统一 让我们从 “人文逻辑与规则逻辑统一” 这一核心视角,对AI元人文构想进行一场深度的剖析与整合。 这不仅是技术的融合,更是一场认识论上的革命。 图片 核心理念:逻辑的统一而非对…