【地铁上的设计模式】--创建型模式:工厂方法模式

news/2024/4/19 7:45:28/文章来源:https://blog.csdn.net/gangzhucoll/article/details/130312988

什么是创建模式

创建型模式是指处理对象创建的设计模式,它们的共同目标是通过某种方式控制对象的创建,以达到更灵活、更可扩展的设计。
创建型模式通常涉及到将对象的创建与使用分离,通过专门的工厂类、构造函数、克隆、抽象工厂、建造者等方式来创建对象。这种方式可以隐藏对象的创建细节,使得对象的创建和使用松耦合,提高了系统的灵活性和可维护性。
常见的创建型模式包括:

  1. 工厂方法模式
  2. 抽象工厂模式
  3. 单例模式
  4. 原型模式
  5. 建造者模式
    这些模式都有不同的特点和使用场景,可以根据具体情况选择合适的模式来实现对象的创建。下面我们将在后续的文章中讲解这五种创建模式。

Tip:我们在讲解设计模式时,将会使用Java和C#两种语言实现。

什么是工厂方法模式

工厂方法模式是一种常见的创建型模式,它定义了一个用于创建对象的接口,但具体的对象创建是由子类决定的。也就是说,工厂方法模式将对象的创建过程封装在一个工厂类中,让子类决定实例化哪一个具体的类。
工厂方法模式包含以下角色:

  1. 抽象产品(Product):定义了产品的接口,是工厂方法创建的所有对象的父类,描述了所有产品的公共接口。
  2. 具体产品(Concrete Product):实现抽象产品接口的具体类,是工厂方法创建的目标对象。
  3. 抽象工厂(Factory):定义了工厂方法的接口,用于创建抽象产品,它是工厂方法模式的核心,任
  4. 在模式中创建对象的工厂类都必须实现该接口。
  5. 具体工厂(Concrete Factory):实现抽象工厂接口的具体类,用于创建具体产品对象。
    使用工厂方法模式可以使得代码更具有可扩展性和可维护性,可以通过添加新的具体工厂和具体产品来扩展系统,而不需要修改原有的代码。同时,它也符合“开闭原则”,即对扩展开放,对修改关闭的原则,可以提高系统的可维护性和可扩展性。

如何实现工厂方法模式

要实现工厂方法模式,可以按照以下步骤进行:

  1. 定义抽象产品接口:抽象产品接口定义产品的公共接口方法。
  2. 定义具体产品类:具体产品类实现抽象产品接口,具体实现产品的功能。
  3. 定义抽象工厂接口:抽象工厂接口定义工厂方法,用于创建产品对象。
  4. 定义具体工厂类:具体工厂类实现抽象工厂接口,具体实现工厂方法,用于创建具体的产品对象。
  5. 在客户端中使用:客户端通过具体工厂类来创建具体产品对象,不需要关心产品对象的创建过程。

Java实现:

// 抽象产品接口
interface Product {void use();
}// 具体产品类A
class ConcreteProductA implements Product {@Overridepublic void use() {System.out.println("使用具体产品A");}
}// 具体产品类B
class ConcreteProductB implements Product {@Overridepublic void use() {System.out.println("使用具体产品B");}
}// 抽象工厂接口
interface Factory {Product createProduct();
}// 具体工厂类A
class ConcreteFactoryA implements Factory {@Overridepublic Product createProduct() {return new ConcreteProductA();}
}// 具体工厂类B
class ConcreteFactoryB implements Factory {@Overridepublic Product createProduct() {return new ConcreteProductB();}
}// 客户端代码
public class Client {public static void main(String[] args) {// 创建具体工厂对象Factory factoryA = new ConcreteFactoryA();Factory factoryB = new ConcreteFactoryB();// 使用具体工厂对象创建具体产品对象Product productA = factoryA.createProduct();Product productB = factoryB.createProduct();// 使用产品productA.use();productB.use();}
}

C#实现

// 抽象产品接口
interface Product {void Use();
}// 具体产品类A
class ConcreteProductA : Product {public void Use() {Console.WriteLine("使用具体产品A");}
}// 具体产品类B
class ConcreteProductB : Product {public void Use() {Console.WriteLine("使用具体产品B");}
}// 抽象工厂接口
interface Factory {Product CreateProduct();
}// 具体工厂类A
class ConcreteFactoryA : Factory {public Product CreateProduct() {return new ConcreteProductA();}
}// 具体工厂类B
class ConcreteFactoryB : Factory {public Product CreateProduct() {return new ConcreteProductB();}
}// 客户端代码
class Client {static void Main(string[] args) {// 创建具体工厂对象Factory factoryA = new ConcreteFactoryA();Factory factoryB = new ConcreteFactoryB();// 使用具体工厂对象创建具体产品对象Product productA = factoryA.CreateProduct();Product productB = factoryB.CreateProduct();// 使用产品productA.Use();productB.Use();}
}

在上面的示例中,通过定义抽象产品接口和具体产品类,以及定义抽象工厂接口和具体工厂类,实现了工厂方法模式。客户端可以通过具体工厂对象创建具体产品对象,并且不需要知道产品对象的具体创建过程,提高了系统的可扩展性和可维护性。

总结

工厂方法模式是一种创建型设计模式,其核心思想是将对象的创建委托给工厂对象,由工厂对象来创建具体的产品对象,客户端无需关心具体产品对象的创建过程,只需要与工厂接口进行交互即可。工厂方法模式由抽象产品、具体产品、抽象工厂、具体工厂和客户端代码五部分组成。抽象产品定义产品的接口规范,具体产品实现抽象产品的接口规范,抽象工厂定义工厂的接口规范,具体工厂实现抽象工厂的接口规范并负责具体产品的创建,客户端代码使用具体工厂来创建具体产品对象。使用工厂方法模式可以将具体产品对象的创建和客户端代码的耦合度降到最低,从而提高系统的可维护性、可扩展性和可重用性。同时,工厂方法模式也符合开闭原则,因为当需要添加新的产品时,只需要增加新的具体产品类和对应的具体工厂类即可,不需要修改原有的代码。
总之,工厂方法模式是一种简单而又实用的设计模式,适用于需要大量创建复杂对象的场景,是面向对象编程中必不可少的工具之一。

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

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

相关文章

ZLMediaKit流媒体服务器 RTSP推流时候的堆栈

先直接看图 这是ffmpeg向流媒体服务器推流时候的堆栈 引入C 11之后 堆栈会显得特别繁复冗余 看起来 也没有 以前没有C11之前那样 简单明了 太复杂了 标记下 很多函数名字被我改了 因为原来的看起来 同名函数太多了 C11 和lambada 匿名函数 让看堆栈 成了地狱模式 断点断在…

Revit中如何绘制轴线?CAD图纸转轴网操作

一、如何用revit来制作这么一个简单的轴线呢? 01 、新建项目 绘制轴线,首先新建项目建筑样板 02 、轴线快捷键 绘制轴线的快捷键需要牢记,因为经常使用GR 03 、编辑轴线类型 当你画好第一条轴线,需要对轴线类型属性进行调节,一般…

基于tensorflow2.x的多GPU并行训练

由于最近训练transformer,在单卡上显存不够,另外一块卡上也无法加载,故尝试使用双卡并行的策略。将基本的流程、遇见的难题汇总在这里。分布策略解释 使用官方给出的tf.distribute.MirroredStrategy作为分布策略。这个策略通过如下的方式运行…

【架构设计】什么是CAP理论?

1、理论 CAP理论是指计算机分布式系统的三个核心特性:一致性(Consistency)、可用性(Availability)和分区容错性(Partition Tolerance)。 在CAP理论中,一致性指的是多个节点上的数据…

宝安日报:联诚发跨界创新“追光”十九载!

世界一流声光电智造一体化服务商、国家级高新技术企业、国家级专精特新“小巨人”企业、博士后创新实践基地、深圳自主创新百强企业……这些熠熠生辉的关键词,是位于宝安区航城街道的深圳市联诚发科技股份有限公司(以下简称:联诚发&#xff0…

KingSCADA3.8保姆级安装教程

大家好,我是雷工! 最近开始学习KingSCADA,今天这篇详细记录安装KingSCADA3.8的过程。 首先下载需要的安装版本,此处以从官网下载的最新版本KingSCADA3.8为例,双击:Setup.exe ; 一、安装主程序 1、点击“…

AutoSAR内存映射

总目录链接>> AutoSAR入门和实战系列总目录 总目录链接>> AutoSAR BSW高阶配置系列总目录 文章目录 为了防止不必要的内存缺口(RAM 中未使用的空间),不同大小(8、16 和 32 位)的变量根据其大小映射到特…

工业树莓派远程I/O控制套装—更高效、更灵活、更便捷

一、背景 在完整的生产过程中,许多传感器设备和执行设备不完全安装在同一位置,大多分散部署在各个生产环节中。如果采用本地控制的方式,就需要用到多个控制器,但是成本较高,且不利于管理,所以最理想的解决…

Vue表单基本操作-收集表单数据

收集表单数据 使用vue中的v-model收集表单里面的数据,不同的表单元素配合v-model会有不同的写法和技巧 本次的表单元素包括:文本框,单选,多选,下拉框,文本域 编写表单元素 首先编写表单元素,…

ROS学习第三十七节——机器人运动控制以及里程计信息显示

https://download.csdn.net/download/qq_45685327/87719766 https://download.csdn.net/download/qq_45685327/87719873 gazebo 中已经可以正常显示机器人模型了,那么如何像在 rviz 中一样控制机器人运动呢?在此,需要涉及到ros中的组件: ros…

camunda的service task如何使用

在 Camunda 中,使用 Service Task 节点可以执行各种类型的业务逻辑,例如计算、数据转换、数据格式化等。在 Service Task 节点中,可以使用不同的编程语言来实现业务逻辑,例如 Java、JavaScript、Python 等。 下面是使用 Java 实现…

状态压缩DP-蒙德里安的梦想

题意 求把 NM 的棋盘分割成若干个 12 的长方形,有多少种方案。 例如当 N2,M4 时,共有 5 种方案。当 N2,M3 时,共有 3 种方案。 如下图所示: 输入格式 输入包含多组测试用例。 每组测试用例占一行&#xff0…

这份最新阿里、腾讯、华为、字节等大厂的薪资和职级对比,你看过没?

互联网大厂新入职员工各职级薪资对应表(技术线)~ 最新阿里、腾讯、华为、字节跳动等大厂的薪资和职级对比 上面的表格不排除有很极端的收入情况,但至少能囊括一部分同职级的收入。这个表是“技术线”新入职员工的职级和薪资情况,非技术线(如产品、运营、…

【Linux】环境变量与进程优先级知识点

目录 环境变量1.基本概念2.常见环境变量3.我们写的程序和命令行指令有什么区别?4.自己的程序为什么要用 ./ 执行,而命令行指令可以直接执行?5.如何追加环境变量?6.Linux如何查看环境变量7.如何在代码层面获取环境变量main函数的参…

ubuntu 3060显卡驱动+cuda+cudnn+pytorch+pycharm+vscode

文章目录 运行环境:适用:思路:1.1 3060显卡驱动自动安装2.1 CUDA11.1.11)下载CUDA Toolkit 11.1 Update 1 Downloads2)contunue , 然后accept3)回车取消Driver安装,然后install4)添加环境变量5)确认是否安装成功 3.1 cudnn 8.1.11…

【Cartopy基础入门】如何更好的确定边界显示

原文作者:我辈理想 版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。 Cartopy基础入门 【Cartopy基础入门】Cartopy的安装 【Cartopy基础入门】Geojson数据的加载 【Cartopy基础入门】如何更好的确定边界显示 文章目录 Ca…

【边缘计算】登临(Goldwasser-UL64)BW-BR2边缘设备配置指南

目录 开箱配置激活SDK环境测试cuda兼容性 开箱配置 更改盒子root用户密码: sudo passwd root(密码同为root) 切换到root用户身份: su root查看ssh的状态,没有返回说明没有启动 sudo ps -e|grep ssh此时说明ssh服务已启动。 更改ssh配置文…

java定位系统源码,通过独特的射频处理,配合先进的位置算法,可以有效计算出复杂环境下的人员与物品的活动信息

智慧工厂人员定位系统源码,区域电子围栏管控源码 文末获取联系! 在工厂日常生产活动中,企业很难精准地掌握访客和承包商等各类人员的实际位置,且无法实时监控巡检人员的巡检路线,当厂区发生灾情或其他异常状况时&#…

postman安装

目录 下载、安装 Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。 Postman原是Chrome浏览器的插件,可以模拟浏览器向后端服务器发起任何形式(如:get、post)的HTTP请求 使用Postman还可以在发起请求时,携带一些请求参数、请求头等信息…

WebSocket+Vue+SpringBoot实现语音通话

参考文章 整体思路 前端点击开始对话按钮后,将监听麦克风,获取到当前的音频,将其装化为二进制数据,通过websocket发送到webscoket服务端,服务端在接收后,将消息写入给指定客户端,客户端拿到发送…