2023-6-10-第一式工厂方法模式

news2025/2/1 11:54:23


🍿*★,°*:.☆( ̄▽ ̄)/$:*.°★* 🍿

💥💥💥欢迎来到🤞汤姆🤞的csdn博文💥💥💥
💟💟喜欢的朋友可以关注一下,下次更新不迷路💟💟
😆😆😆私聊获取个人订阅号哦,欢迎订阅共同学习😆😆😆
💖💖💖💖可以加入大家庭群聊,一起学习天天有福利💖💖💖💖





🍬本文摘要

在这里插入图片描述

设计方法二十三式之工厂方法模式


目录

  • 🍬本文摘要
  • 🎉一、基础概念
  • 🎉二、工厂方法模式实现
  • 🎉三、注意事项
  • 🎉四、补充-简单工厂模式
  • 🎉五、补充-单一职责原则
  • 🍳参考文献
  • 🧊文章总结



🎉一、基础概念

工厂方法模式(Factory Method Pattern)是一种常见的创建型设计模式,它通过定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法模式使得一个类的实例化延迟到其子类。

在工厂方法模式中,通常包含以下几个角色:

  1. 抽象产品(Product):定义了产品的属性和方法。
  2. 具体产品(Concrete Product):实现抽象产品的具体属性和方法。
  3. 抽象工厂(Creator):定义用于创建产品的接口,包含一个抽象工厂方法。
  4. 具体工厂(Concrete Creator):实现抽象工厂接口,创建具体产品的实例对象。

以生产汽车为例,假设我们有两个品牌的汽车:奥迪和宝马。使用工厂方法模式可以这样实现:

  1. 定义一个抽象产品Car,包含属性和方法:brand, model, getBrand(), getModel()等。
  2. 定义两个具体产品:AudiCar和BMWCar,分别实现Car的属性和方法。
  3. 定义一个抽象工厂CarFactory,包含工厂方法createCar(),用于生产汽车对象。
  4. 分别定义AudiCarFactory和BMWCarFactory,实现CarFactory接口,重写createCar()方法,分别生产AudiCar和BMWCar的实例对象。

通过以上步骤,我们就可以使用工厂方法模式来生产奥迪和宝马两个品牌的汽车对象。在实际开发中,工厂方法模式常用于解耦对象的创建和使用,提高代码的可维护性和灵活性。


🎉二、工厂方法模式实现

在C++中,实现工厂方法模式可以分为以下几个步骤:

  1. 定义抽象产品类,声明产品的属性和方法:
class Product {
public:
    virtual void Show() = 0;
};
  1. 定义具体产品类,继承自抽象产品类,实现具体产品的属性和方法:
class ConcreteProductA : public Product {
public:
    void Show() { 
        std::cout << "This is ConcreteProductA!" << std::endl; 
    }
};

class ConcreteProductB : public Product {
public:
    void Show() { 
        std::cout << "This is ConcreteProductB!" << std::endl; 
    }
};
  1. 定义抽象工厂类,声明工厂方法createProduct(),用于创建产品对象:
class Factory {
public:
    virtual Product* createProduct() = 0;
};
  1. 定义具体工厂类,继承自抽象工厂类,重写工厂方法createProduct(),用于创建具体产品对象:
class ConcreteFactoryA : public Factory {
public:
    Product* createProduct() {
        return new ConcreteProductA();
    }
};

class ConcreteFactoryB : public Factory {
public:
    Product* createProduct() {
        return new ConcreteProductB();
    }
};
  1. 在客户端使用时,通过调用具体工厂的createProduct()方法创建具体产品对象:
int main() {
    Factory* factoryA = new ConcreteFactoryA();
    Product* productA = factoryA->createProduct();
    productA->Show();

    Factory* factoryB = new ConcreteFactoryB();
    Product* productB = factoryB->createProduct();
    productB->Show();

    delete productA;
    delete factoryA;

    delete productB;
    delete factoryB;

    return 0;
}

通过以上步骤,我们就可以在C++中实现工厂方法模式,达到将对象的创建和使用分离的目的,提高代码灵活性和可维护性。


🎉三、注意事项

在实现工厂方法模式时,需要注意以下几个问题:

  1. 抽象产品类和具体产品类的设计应该尽可能简单,遵循单一职责原则,不要包含过多的复杂逻辑。
  2. 工厂类的设计应该尽可能灵活,可以通过配置文件、参数等方式动态改变所创建的具体产品类。
  3. 注意工厂方法的返回值类型,通常应该使用基类指针或引用来接收具体产品对象,以保证代码的扩展性和可维护性。
  4. 在具体工厂中创建具体产品对象时,应该根据需要进行异常处理,比如判断是否成功分配内存、是否存在无效输入等情况。
  5. 合理使用智能指针,避免内存泄漏等问题。
  6. 工厂方法模式并不是万能的,需要根据具体情况选择合适的创建型模式。如果需要创建的对象较少且固定,可以考虑使用简单工厂模式如果需要创建的对象较多,且需要动态扩展,则可以使用工厂方法模式
  7. 最后,建议在程序正式运行前进行充分测试,确保代码的正确性和稳定性。

🎉四、补充-简单工厂模式

简单工厂模式(Simple Factory Pattern)是一种常见的创建型设计模式,它通过一个工厂类来实现对象的创建。简单工厂模式属于静态工厂模式,由一个工厂类根据传入的参数,动态决定创建哪一种产品类的实例

在简单工厂模式中,通常包含以下几个角色:

  1. 抽象产品类(Product):定义了产品的属性和方法。
  2. 具体产品类(Concrete Product):实现抽象产品的具体属性和方法。
  3. 工厂类(Factory):负责创建具体产品的实例对象,并提供一个静态方法用于创建对象。

以生产汽车为例,使用简单工厂模式可以这样实现:

  1. 定义一个抽象产品Car,包含属性和方法:brand, model, getBrand(), getModel()等。
  2. 定义两个具体产品:AudiCar和BMWCar,分别实现Car的属性和方法。
  3. 定义一个工厂类CarFactory,提供一个静态方法createCar(),用于根据输入参数创建对应的汽车对象:
class CarFactory {
public:
    static Car* createCar(string brand) {
        if (brand == "Audi") {
            return new AudiCar();
        } else if (brand == "BMW") {
            return new BMWCar();
        } else {
            return nullptr;
        }
    }
};
  1. 在客户端使用时,通过调用工厂类的静态方法createCar()创建具体产品对象:
int main() {
    Car* carA = CarFactory::createCar("Audi");
    if (carA != nullptr) {
        carA->Show();
        delete carA;
    }

    Car* carB = CarFactory::createCar("BMW");
    if (carB != nullptr) {
        carB->Show();
        delete carB;
    }

    return 0;
}

通过以上步骤,我们就可以使用简单工厂模式来生产奥迪和宝马两个品牌的汽车对象。在实际开发中,简单工厂模式常用于解耦对象的创建和使用,提高代码的可维护性和灵活性。


🎉五、补充-单一职责原则

单一职责原则(Single Responsibility Principle,SRP)是指一个类或模块应该有且只有一个单一的功能,并且该功能应该由这个类或模块完全封装起来。

简单来说,就是一个类或模块应该只负责一种职责,它所提供的所有服务都应该严密地支持这一职责。如果一个类或模块承担了多种职责,那么它就变得难以理解、维护和扩展

例如,在设计一个汽车类时,它应该只包含与汽车相关的属性和方法,比如品牌、型号、速度等,而不应该包含与其他领域无关的职责,比如计算机程序或图形界面等。如果一个类同时包含了多种职责,那么在使用和修改时就会非常困难,也容易引发错误和bug。

通过遵循单一职责原则,我们可以将系统中的行为划分为更小的、更具体的领域,从而使代码更加清晰、简洁和易于维护。同时,单一职责原则也有助于减少类之间的耦合度,提高代码的灵活性和可复用性。


🍳参考文献

🧊文章总结

提示:这里对文章进行总结:

  本文讲了关于工厂方法模式的实现和注意事项,比较简单。






更多好文推荐

🍸2021-4月Python 机器学习——中文新闻文本标题分类
🍹2021年4月-(计算机网络)小型校园网络模拟搭建,最全最准确版
🍺2022-10-31-基于用户的协同过滤推荐算法实现+MAE+RMSE
🍻2022-11-28-大数据可视化,特征维度大于50
🥂2023-3-9-一篇简短的文章把C++左右值关系讲的透透彻彻

上一篇
End
下一篇

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

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

相关文章

安卓与串口通信-数据分包的处理

前言 本文是安卓串口通信的第 5 篇文章。本来这篇文章不在计划内&#xff0c;但是最近在项目中遇到了这个问题&#xff0c;正好借此机会写一篇文章&#xff0c;在加深自己理解的同时也让大伙对串口通信时接收数据可能会出现分包的情况有所了解。 其实关于串口通信会可能会出现…

编译tolua——3、以pbc为例子,添加第三方库

目录 1、编译工具和环境说明 2、基础编译tolua 3、以pbc为例子&#xff0c;添加第三方库 4、更新luaJit 大家好&#xff0c;我是阿赵。 之前分享过怎样正常编译基础版本的tolua。这次用添加pbc为例&#xff0c;看看怎样往tolua里面添加其他的第三方库。知道了方法之后&#xf…

【郭东白架构课 模块二:创造价值】31 |节点六: 如何组织阶段性的价值交付?

你好&#xff0c;我是郭东白。上节课我们讲了为什么要做阶段性的价值交付&#xff0c;以及进入阶段性价值交付环节的准备工作。有了这些学习基础&#xff0c;这节课我们就可以进行阶段性价值交付了。 在交付的过程中&#xff0c;主要有三部分工作&#xff1a;目标分解、定义交…

SLAM十四讲——ch4实践(李群李代数)

视觉SLAM14讲----ch4的操作及避坑 一、ch4的实践的准备工作二、各个实践操作1. Sophus的基本使用方法2. 例子&#xff1a;评估轨迹误差 三、遇到的问题 一、ch4的实践的准备工作 确保已经有Sophus库&#xff0c;Sophus库是一个较好的李代数库。 注意&#xff1a; 开始时slamb…

MySQL 数据库实用指南:测试数据准备、SQL语句规范与基本操作

前言 欢迎来到小K的MySQL专栏&#xff0c;本节将为大家准备MySQL测试数据、以及带来SQL语句规范、数据库的基本操作的详细讲解~✨文末送书&#xff0c;小K赠书活动第二期 目录 前言一、准备测试数据二、SQL语句规范三、数据库的基本操作四、总结&#xff1a;文末赠书 一、准备测…

Linux之进程间通信——system V(共享内存、消息队列、信号量等)

文章目录 前言一、共享内存1.共享内存的基本原理2.共享内存的创建3.共享内存的控制参数返回值共享内存的内核数据结构 4.共享内存的关联参数 5.共享内存的去关联6.查看IPC资源7.查看共享内存8.删除共享内存 二、实现进程间通信&#xff08;代码&#xff09;三、共享内存的特点四…

【Newman+Jenkins】实施接口自动化测试

一、是什么Newman Newman就是纽曼手机这个经典牌子&#xff0c;哈哈&#xff0c;开玩笑啦。。。别当真&#xff0c;简单地说Newman就是命令行版的Postman&#xff0c;查看官网地址。 Newman可以使用Postman导出的collection文件直接在命令行运行&#xff0c;把Postman界面化运…

软件测试—冒烟测试

1. 核心 冒烟测试就是完成一个新版本的开发后&#xff0c;对该版本最基本的功能进行测试&#xff0c;保证基本的功能和流程能走通。 如果不通过&#xff0c;则打回开发那边重新开发&#xff1b; 如果通过测试&#xff0c;才会进行下一步的测试(功能测试&#xff0c;集成测试…

【ThreadLocal为什么可能内存泄漏?】 —— 每天一点小知识

&#x1f4a7; T h r e a d L o c a l 为什么可能内存泄漏&#xff1f; \color{#FF1493}{ThreadLocal为什么可能内存泄漏&#xff1f;} ThreadLocal为什么可能内存泄漏&#xff1f;&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个…

渗透测试综合实验

文章目录 一、前期交互二、信息搜集三、威胁建模五、渗透攻击1.弱口令攻击2.SQL注入3.不安全文件上传 六、后渗透攻击利用1.蚁剑安装2.一句话木马利用 七、漏洞报告 一、前期交互 二、信息搜集 使用nmap收集端口、域名、后台信息 目标IP nmap -O -sV IP 三、威胁建模 寻…

基于javaweb jsp+servlet实验室设备管理系统的设计与实现

一.项目介绍 本系统分为 超级管理员、老师、学生三类角色 超级管理员&#xff1a;通知管理、维护用户信息、实验室管理&#xff08;负责维护实验室、预约实验室&#xff09;、设备管理&#xff08;维护技术参数、维护运行数据、维护电子文档&#xff09;、设备维修管理&am…

第5章 总体设计

第5章 总体设计 总体设计是决定”怎样做”。也就是概括的说&#xff0c;系统应该如何实现&#xff0c;因此总体设计也被称作概要设计。 5.1 设计过程 例题 5.2 设计原理 5.2.1 模块化 模块是由边界元素限定的相邻程序元素&#xff08;例如&#xff0c;数据说明&#xff0c;…

【Spring Boot】Spring Boot特点及重要策略,含安装步骤详细讲解

前言 Spring Boot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。通过这种方式&#xff0c;Spring Boot致力于在蓬勃发展的快速应…

Matplotlib 绘制多图

Matplotlib 绘制多图 我们可以使用 pyplot 中的 subplot() 和 subplots() 方法来绘制多个子图。 subplot() 方法在绘图时需要指定位置&#xff0c;subplots() 方法可以一次生成多个&#xff0c;在调用时只需要调用生成对象的 ax 即可。 subplot subplot(nrows, ncols, inde…

微服务_Nacos

简介 Nacos&#xff08;全称为“动态服务发现、配置和服务管理平台”&#xff09;是阿里巴巴开源的一款云原生服务发现和配置管理平台&#xff0c;支持多种语言和多种环境&#xff0c;包括Kubernetes、Docker、Spring Cloud等常见的云原生环境。它提供了服务发现、配置管理、服…

MFC的定义和实际操作方法

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天从另一个角度来看一下MFC。 完整的应用一般由四个类组成&#xff1a;CWinApp应用类&#xff0c;CFrameWnd窗口框架类&#xff0c;CDocument文档类&#xff0c;CView视类 过程&#xff1a;CWinApp创建CF…

算法刷题-链表-反转链表

反转链表 206.反转链表思路C代码双指针法递归法其他语言版本使用虚拟头结点解决链表翻转使用栈解决反转链表的问题 反转链表的写法很简单&#xff0c;一些同学甚至可以背下来但过一阵就忘了该咋写&#xff0c;主要是因为没有理解真正的反转过程。 206.反转链表 力扣题目链接 …

【Java基础篇】方法的使用(方法的使用以及形参实参的关系)

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a;Java.SE&#xff0c;本专栏主要讲解运算符&#xff0c;程序逻辑控制&#xff0c;方法的使用&…

【线程安全问题】线程互斥与线程同步技术

在达内Windows/Win32编程专栏中&#xff0c;我们已经介绍过线程同步与线程互斥技术&#xff0c;包括了原子锁&#xff0c;互斥体&#xff0c;事件和信号量。但是与海哥讲的线程同步与线程互斥技术不太一样&#xff0c;这篇文章来带领大家学习线程同步与线程互斥技术&#xff0c…

新手运行bert,pycharm不识别conda安装的python环境

提示No module named numpy/tensorflow conda list是有这些包的 pycharm识别不出interpreter的package 改成scripts下的python.exe就能识别出numpy和tensorflow了 改完interpreter之后出现过importerror: dll load failed&#xff0c;在environment variables里加了这些就不报错…