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

embedded/2024/9/23 18:03:08/

设计模式-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.ppmy.cn/embedded/33888.html

相关文章

ARM/Linux嵌入式面经(九):海康威视

​海康-脑子里想想你的答案&#xff01; 主观题较多&#xff0c;无答案。关于文件系统和网卡相关&#xff0c;专门出文。 一面&#xff08;3.23,35min&#xff09; 1.自我介绍 2.项目介绍 3.你做的这个项目遇到了哪些问题&#xff0c;如何解决的&#xff1f; 4.移植uboot&am…

【4088】基于小程序实现的二手物品交易系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

Vue 2 中组件详解

什么是组件&#xff1f; 在Vue中&#xff0c;组件是可复用的Vue实例&#xff0c;每个组件都可以拥有自己的模板、脚本和样式。通过组件化&#xff0c;我们可以将页面拆分为多个独立的、可复用的部分&#xff0c;使得代码更易于维护和扩展。 创建组件 在Vue 2中&#xff0c;我们…

力扣-349. 两个数组的交集

文章目录 力扣题目代码C实现(set容器)C实现(map容器) 力扣题目 给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的 交集。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 输…

2024年全国保密宣传教育月的主题是()。A.贯彻落实保密法。你我都是护密人B.国家利益高于一切,保密责任重于泰山C.筑牢保密防线,维护国家安全

2024年全国保密宣传教育月的主题是()。点击查看答案 A.贯彻落实保密法。你我都是护密人B.国家利益高于一切&#xff0c;保密责任重于泰山 C.筑牢保密防线&#xff0c;维护国家安全D.共筑保密防线&#xff0c;公民人人有责 坚持不懈开展保密宣传教育&#xff0c;是保密工作实…

JavaScript中的深拷贝与浅拷贝

目录 引言&#xff1a; 一、浅拷贝&#xff08;Shallow Copy&#xff09; 二、深拷贝&#xff08;Deep Copy&#xff09; 实现深拷贝的方法&#xff1a; 1.使用JSON.parse(JSON.stringify(obj)) 2.使用递归实现深拷贝 三、总结 引言&#xff1a; 在JavaScript中&#xff0…

5.5代码

目录 1.内存空间 1.内存空间 真的要吐了&#xff0c;人都麻了题还没看完&#xff0c;看样子就是要想办法提取出来想要的东西2022第十三届蓝桥杯决赛C/C大学A组-C题内存空间_蓝桥杯a组c语言题目-CSDN博客 这个是一个非常清晰的代码&#xff0c;好几个帖子都管这个题叫大模拟题…

【华为】路由综合实验(OSPF+BGP基础)

【华为】路由综合实验 实验需求拓扑配置AR1AR2AR3AR4AR5PC1PC2 查看通信OSPF邻居OSPF路由表 BGPBGP邻居BGP 路由表 配置文档 实验需求 ① 自行规划IP地址 ② 在区域1里面 启用OSPF ③ 在区域1和区域2 启用BGP&#xff0c;使AR4和AR3成为eBGP&#xff0c;AR4和AR5成为iBGP对等体…