设计模式-02 设计模式-工厂模式factory


设计模式-02 设计模式-工厂模式factory

1.定义


工厂模式是一种创建型设计模式,它定义了一个创建对象的接口,让子类决定实例化哪一个类。

工厂模式使程序不必指定要创建产品的具体类,从而解耦应用程序与实际创建产品的具体类。

工厂模式提供了一种创建对象的方式,而无需指定要创建的具体类。

工厂模式属于创建型模式,它在创建对象时提供了一种封装机制,将实际创建对象的代码与使用代码分离。
               

			   .-------------.|             || Factory     |'-------------'||.-------------------------v---------------------.|                                               ||           ProductA             ProductB       ||-----------------------------------------------||              |              ||  ProductA1   |  ProductA2   |  ProductB1 ||              |              |            | .-----------------. |              |              ||               |   v              v              v          |Client  .---> | FactoryMethod  | ->  ProductA1   ->  ProductA2   -> ProductB1|               |'---------------'
2.内涵

设计原则:

  • 单一职责原则:工厂类仅负责创建对象,不负责其他操作。
  • 开闭原则:工厂类对扩展开放,对修改关闭。新产品可以轻松添加到工厂中,而无需修改现有代码。
  • 依赖倒置原则:应用程序依赖于抽象(工厂类),而不是具体实现(产品类)。

优点:

  • 提高代码的灵活性,容易扩展。
  • 解耦应用程序与具体创建产品的类。
  • 封装产品创建过程,提高了可维护性。

缺点:

  • 引入了额外的抽象层,可能会增加代码复杂性。
  • 如果需要经常创建新产品,可能会导致大量工厂类。
3.案例对比


bad 设计


#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <fstream>
#include <tuple>
#include <sstream>
#include <memory>
#include <cmath>using namespace std;enum class PointType
{cartesian,polar
};struct Point
{/***  构造方法* @param a x or rho* @param b y or theta* @param type  根据Type 初始化对象*/Point(float a, float b, PointType type = PointType::cartesian){if(type == PointType::cartesian){x = a;y = b;}else {x = a * cos(b);y = a * sin(b);}}float x, y;
};int main()
{return 0;
}


好的设计

#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <fstream>
#include <tuple>
#include <sstream>
#include <memory>
#include <cmath>
using namespace std;enum class PointType
{cartesian,polar
};struct Point
{Point(float x, float y):x(x),y(y){}public:float x, y;static Point NewCartesian(float x, float y)   // 静态工厂方法{return {x,y};}static Point NewPolar(float rho, float theta)   // 静态工厂方法{return {rho*cos(theta), rho*sin(theta)};}friend ostream &operator<<(ostream &os, const Point &point){os << "X:" << point.x << " Y:" << point.y << endl;return os;}
};int main()
{auto p = Point::NewPolar(5, 3.1415 / 4);cout << p <<endl;
}

4.注意事项

简单工厂

  • 局限性:限制了创建产品的灵活性,仅能创建预先定义好的产品。
  • 依赖管理:难以管理创建不同产品所依赖的类和对象。

其他注意事项:

  1. 职责单一原则:工厂类应仅负责创建产品,避免与其他职责混合。
  2. 可扩展性:工厂设计应考虑可扩展性,以支持未来添加新产品。
  3. 可测试性:工厂代码应易于测试,以验证创建产品的正确性。
  4. 性能瓶颈:如果工厂创建产品需要大量计算或资源,可能会成为性能瓶颈。
  5. 谨慎使用:工厂模式的过度使用可能会导致代码复杂性和维护成本增加。

5.最佳实践
  • 考虑抽象工厂,而不是简单工厂:抽象工厂提供更灵活和可扩展的解决方案。
  • 使用反射创建产品:当产品类型在运行时才知道时,反射可以帮助创建产品。
  • 利用设计模式组合:将工厂模式与其他模式相结合,例如策略模式或单例模式,以提高代码的可重用性和灵活性。
  • 单元测试工厂:使用单元测试验证工厂创建产品的正确性。
  • 避免过度使用:只有在确实需要分离产品创建时才使用工厂模式。

6.总结
 

工厂模式提供了一种创建对象而不指定其具体类的接口。

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

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

相关文章

drop、delete与truncate的区别

在数据库管理系统&#xff08;如SQL&#xff09;中&#xff0c;DROP、DELETE和TRUNCATE是用于删除数据的不同命令&#xff0c;区别主要体现在删除的对象和方式以及对数据库事务日志的影响&#xff1a; DELETE: 用于删除表中的一行、多行或所有行。可以配合WHERE子句来指定删除的…

Themis新篇章:老牌衍生品协议登陆Blast L2,探索全新经济模型

本文将深入分析 Themis 的最新经济模型&#xff0c;探讨其核心概念和机制、优势与创新之处、风险与挑战。 一、引言 随着区块链技术的不断发展&#xff0c;DeFi 衍生品项目逐渐成为市场的焦点。而用户体验的革新&#xff0c;进一步的金融创新&#xff0c;去中心化治理方案的优…

SpringCloud整合Gateway结合Nacos

目录 一、引入依赖 二、开启两个测试项目 2.1 order service ​编辑 2.2 user service 三、gateway项目 3.1 新建一个bootstrap.yml文件 3.2 将我们的的网关配置写道nacos里的配置里 3.3 测试&#xff1a;看能够根据网关路由到两个测试的项目 四、 优化 4.1 将项目打包…

字节跳动发起AI战争 寻找下一个TikTok

现如今在字节跳动&#xff0c;已近乎隐退的张一鸣&#xff0c;只重点关注两件事&#xff1a;其一&#xff0c;是风暴中的TikTok&#xff1b;其二&#xff0c;就是字节跳动正在全力追赶的AI战略业务。 提及字节的AI战略远望,多个接近字节的人士均认为,以Flow部门出品最为“正统…

JavaScript中的防抖(Debounce)和节流(Throttle):作用与使用方式

目录 引言 防抖&#xff08;Debounce&#xff09; 作用 使用方式 节流&#xff08;Throttle&#xff09; 作用 使用方式 总结 引言 在前端开发中&#xff0c;我们经常会遇到需要处理高频触发的事件&#xff0c;如窗口大小调整、输入框内容变化、滚动事件等。这些事件在…

pthread线程相关

LWP :轻量级 进程&#xff0c;本质仍是进程 进程 &#xff1a;独立地址空间&#xff0c;拥有PCB 线程&#xff1a;有独立的TCB&#xff0c;但没有独立的地址空间&#xff08;共享&#xff09; 区别 &#xff1a;在与是否共享地址文件 进程 &#xff08;独居&#xff09;&am…

数据结构:最小生成树(Prim算法和Kruskal算法)、图的最短路径(Dijkstra算法和Bellman-Ford算法)

什么是最小生成树&#xff1f;Prim算法和Kruskal算法是如何找到最小生成树的&#xff1f; 最小生成树是指在一个连通图中&#xff0c;通过连接所有节点并使得总权重最小的子图。 Prim算法和Kruskal算法是两种常用的算法&#xff0c;用于寻找最小生成树。 Prim算法的步骤如下&…

文件API及其操作

这里介绍两类文件操作、三个文件类。包括文件系统操作&#xff08;File类&#xff09;、文件内容操作&#xff08;操作字节流、操作字符流&#xff09; 1.文件类File 1.1.认识File类 &#xff08;1&#xff09;什么是File类呢&#xff1f;其实就是可以操作文件的一个类。通过…

C# dateTimePicker控件存取数据库问题

存入数据库时&#xff0c;先设置&#xff0c; dateTimePicker1.Format DateTimePickerFormat.Custom; dateTimePicker1.CustomFormat "yyyy-MM-dd HH:mm:ss"; 然后&#xff0c;dateTimePicker1.Text 就和textBox1.Text一样方式存入数据库&#xff1b;…

结构化开发中耦合和内聚的类型

一、耦合 1、无直接耦合。指两个模块之间没有直接的关系&#xff0c;它们分别从属于不同模块的控制与调用&#xff0c;它们之间不传递任何信息。因此&#xff0c;模块间耦合性最弱&#xff0c;模块独立性最高。 2、数据耦合。指两个模块之间有调用关系&#xff0c;传递的是简单…

【Java EE】Mybatis之XML详解

文章目录 &#x1f38d;配置数据库连接和MyBatis&#x1f340;写持久层代码&#x1f338;添加mapper接口&#x1f338;添加UserInfoXMLMapper.xml&#x1f338;单元测试 &#x1f332;CRUD&#x1f338;增(Insert)&#x1f338;删(Delete)&#x1f338;改(Update)&#x1f338;…

低空经济+飞行汽车:eVTOL技术详解

低空经济是以各种有人驾驶和无人驾驶航空器的各类低空飞行活动为牵引&#xff0c;辐射带动相关领域融合发展的综合性经济形态。它广泛体现于第一、第二、第三产业之中&#xff0c;在促进经济发展、加强社会保障、服务国防事业等方面发挥着日益重要的作用。 飞行汽车&#xff0c…

Linux服务器常用命令总结

view查找日志关键词 注意日志级别&#xff0c;回车后等一会儿&#xff0c;因为文件可能比较大加载完需要时间 当内容显示出来后&#xff0c;使用“/关键词”搜索 回车就能搜到&#xff0c;n表示查找下一个&#xff0c;N表示查找上一个 find 查找 find Family -name book …

js APIS part2

什么是事件&#xff1f; 事件是在编程时系统内发生的 动作 或者发生的事情。比如用户在网页上 单击 一个按钮 什么是事件监听&#xff1f; 就是让程序检测是否有事件产生&#xff0c;一旦有事件触发&#xff0c;就立即调用一个函数做出响应&#xff0c;也称为 绑定事件或者注册…

Python爬取豆瓣电影Top250数据

任务 爬取豆瓣电影top250中的影片名称、影片海报、年份、地区、类型、评分、评价人数、总体评价&#xff0c;并输出到douban_top250.xlsx文件中 环境 Python 3.8 requests bs4 openpyxl 源码 # 创建一个新的Excel工作簿 workbook openpyxl.Workbook() # 获取默认的工作表…

酒水门店私域流量运营搭建执行规划方案

【干货资料持续更新&#xff0c;以防走丢】 酒水门店私域流量运营搭建执行规划方案 部分资料预览 资料部分是网络整理&#xff0c;仅供学习参考。 PPT可编辑&#xff08;完整资料包含以下内容&#xff09; 目录 精酿啤酒品牌私域执行运营的内容策划&#xff0c;涉及以下几个…

Messari 报告摘要 :Covalent Network(CQT)2024 年第一季度表现

摘要&#xff1a; 尽管 CQT 代币流通供应量增加了 20%&#xff08;新增 1.04 亿枚 CQT&#xff09;&#xff0c;但 CQT 的质押百分比仅从 2023 年第一季度的 22% 增长到了 2024 年第一季度的 29%。 CQT 的市值季度环比增长了 28%&#xff0c;多次达到 2.75 亿美元&#xff0c…

全栈开发之路——前端篇(4)watch监视、数据绑定和计算属性

全栈开发一条龙——前端篇 第一篇&#xff1a;框架确定、ide设置与项目创建 第二篇&#xff1a;介绍项目文件意义、组件结构与导入以及setup的引入。 第三篇&#xff1a;setup语法&#xff0c;设置响应式数据。 辅助文档&#xff1a;HTML标签大全&#xff08;实时更新&#xff…

zabbix 入门教程

Zabbix是一个开源的监控系统&#xff0c;它可以用来监控网络、服务器、虚拟机和云资源等。以下是从入门到掌握Zabbix的一些基本步骤&#xff1a; 1. 安装Zabbix 首先&#xff0c;你需要在你的服务器上安装Zabbix。Zabbix支持多种操作系统&#xff0c;包括Linux、Windows和mac…

react使用谷歌人机验证

在项目中&#xff0c;需要对请求验证&#xff0c;防止被爆破&#xff0c;这里使用的是谷歌的recaptcha-v3。 1.申请谷歌人机验证的api 申请链接,申请完后需要将两个谷歌颁发的key分别写入前&#xff0c;后端的配置环境中&#xff0c;后面会使用. 2.前端部分 前端使用的是viteC…