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

【设计模式】简单工厂模式

C语言实现简单的工厂模式

#include <stdio.h>
#include <stdlib.h>// 图形类型枚举
typedef enum {CIRCLE,SQUARE,RECTANGLE
} ShapeType;// 图形结构体
typedef struct {ShapeType type;float area;
} Shape;// 创建圆形
Shape* createCircle() {Shape* circle = (Shape*)malloc(sizeof(Shape));circle->type = CIRCLE;circle->area = 0.0;return circle;
}// 创建正方形
Shape* createSquare() {Shape* square = (Shape*)malloc(sizeof(Shape));square->type = SQUARE;square->area = 0.0;return square;
}// 创建长方形
Shape* createRectangle() {Shape* rectangle = (Shape*)malloc(sizeof(Shape));rectangle->type = RECTANGLE;rectangle->area = 0.0;return rectangle;
}// 工厂方法根据类型创建图形
Shape* createShape(ShapeType type) {switch (type) {case CIRCLE:return createCircle();case SQUARE:return createSquare();case RECTANGLE:return createRectangle();default:return NULL;}
}int main() {Shape* circle = createShape(CIRCLE);Shape* square = createShape(SQUARE);Shape* rectangle = createShape(RECTANGLE);// 假设这里对图形对象进行了一些操作// 释放内存free(circle);free(square);free(rectangle);return 0;
}

C++实现简单的工厂模式

#include <iostream>// 图形类型枚举
enum class ShapeType {CIRCLE,SQUARE,RECTANGLE
};// 图形基类
class Shape {
public:virtual ~Shape() {}virtual float getArea() = 0;
};// 圆形类
class Circle : public Shape {
public:Circle() {std::cout << "Creating Circle..." << std::endl;}float getArea() override {std::cout << "Calculating Circle Area..." << std::endl;// 计算圆形面积的具体实现return 0.0;}
};// 正方形类
class Square : public Shape {
public:Square() {std::cout << "Creating Square..." << std::endl;}float getArea() override {std::cout << "Calculating Square Area..." << std::endl;// 计算正方形面积的具体实现return 0.0;}
};// 长方形类
class Rectangle : public Shape {
public:Rectangle() {std::cout << "Creating Rectangle..." << std::endl;}float getArea() override {std::cout << "Calculating Rectangle Area..." << std::endl;// 计算长方形面积的具体实现return 0.0;}
};// 图形工厂类
class ShapeFactory {
public:static Shape* createShape(ShapeType type) {switch (type) {case ShapeType::CIRCLE:return new Circle();case ShapeType::SQUARE:return new Square();case ShapeType::RECTANGLE:return new Rectangle();default:std::cout << "Invalid Shape Type!" << std::endl;return nullptr;}}
};int main() {Shape* circle = ShapeFactory::createShape(ShapeType::CIRCLE);Shape* square = ShapeFactory::createShape(ShapeType::SQUARE);Shape* rectangle = ShapeFactory::createShape(ShapeType::RECTANGLE);// 假设这里对图形对象进行了一些操作// 删除对象,避免内存泄漏delete circle;delete square;delete rectangle;return 0;
}

工厂模式的优缺点:

优点:

封装对象的创建:工厂模式将对象的创建过程封装在工厂类中,客户端代码无需直接调用构造函数来创建对象,从而降低了代码耦合度。
易于扩展:如果需要添加新类型的产品(图形),只需要添加一个新的产品类和对应的工厂方法即可,不需要修改现有代码,符合开闭原则。
屏蔽具体实现:客户端只需与抽象产品和抽象工厂进行交互,不关心具体的产品类和工厂类,隐藏了产品对象的具体实现。
创建对象的集中管理:所有产品的创建都在工厂类中,便于统一管理和维护。
容易调试:通过在工厂方法中添加打印语句,可以方便地观察对象的创建过程和其他信息,便于调试。

缺点:

增加了类的个数:每个具体产品都需要一个对应的具体工厂类,如果产品较多,会增加类的数量,增加系统复杂性。
增加了系统抽象性:引入工厂类和抽象产品,增加了系统的抽象性和理解难度,增加开发难度。
不易理解:工厂模式的代码会比直接创建对象的方式复杂,理解起来可能会有一定困难。
可能造成额外开销:在运行时使用工厂方法创建对象可能会比直接使用构造函数创建对象稍微慢一些,因为需要进行动态内存分配。但在实际应用中,这个开销通常是可以忽略不计的。

综上所述,工厂模式是一种灵活且可扩展的设计模式,它通过封装对象的创建过程,帮助我们降低代码的耦合度,并支持系统的扩展和维护。工厂模式适用于需要在运行时动态创建对象的场景,例如创建不同类型的图形、产品、对象等。通过工厂模式,我们可以更加灵活地管理对象的创建,使代码结构更加清晰和易于维护。

然而,工厂模式也有一些局限性,例如增加了类的数量和抽象性,可能会增加代码的复杂性和理解难度。在使用工厂模式时,需要根据实际情况来选择合适的设计方案,避免过度设计。对于简单的应用场景,直接使用构造函数创建对象可能更为简单和直观。

总的来说,工厂模式是一种有用的设计模式,它在合适的场景下可以为我们提供更好的设计和代码组织结构。对于复杂的系统,特别是涉及到大量对象创建和管理的情况,工厂模式可以发挥更大的优势。在实际项目中,根据具体需求和复杂度选择是否使用工厂模式是很重要的。

http://www.lryc.cn/news/103725.html

相关文章:

  • 推荐系统-ALS协同过滤算法实现
  • QT第三讲
  • Linux内核的I2C驱动框架详解------这应该是我目前600多篇博客中耗时最长的一篇博客
  • 【点云处理教程】05-Python 中的点云分割
  • 代码随想录算法训练营之JAVA|第十七天| 654. 最大二叉树
  • C++重写函数、隐藏函数、重载函数的区别对比
  • 15.python设计模式【函数工厂模式】
  • Redis主从复制、哨兵、cluster集群原理+实验
  • 微信小程序如何实现页面传参?
  • OPC DA 客户端与服务器的那点事
  • Java 错误异常介绍(Exceptions)
  • 每日一题——旋转数组的最小数字
  • SpringBoot Jackson 日期格式化统一配置
  • 剑指 Offer 38. 字符串的排列 / LeetCode 47. 全排列 II(回溯法)
  • 【前端知识】React 基础巩固(四十三)——Effect Hook
  • 一百三十八、ClickHouse——使用clickhouse-backup备份ClickHouse库表
  • 【无标题】使用Debate Dynamics在知识图谱上进行推理(2020)7.31
  • windows下若依vue项目部署
  • 【目标检测】基于yolov5的水下垃圾检测(附代码和数据集,7684张图片)
  • P1734 最大约数和
  • Excel将单元格中的json本文格式化
  • Baumer工业相机堡盟工业相机如何通过BGAPI SDK获取相机当前实时帧率(C#)
  • XGBoost的基础思想与实现
  • 【Docker】Docker的服务更新与发现
  • 【Docker 学习笔记】Docker架构及三要素
  • matlab编程实践14、15
  • C++ ——STL容器【list】模拟实现
  • ubuntu 16.04 安装mujoco mujoco_py gym stable_baselines版本问题
  • 自然语言处理(NLP)技术
  • 如何将ubuntu LTS升级为Pro