设计模式,简单工厂模式

23种设计模式是基于面向对象的一些编程逻辑思想,无意间看了看《大话设计模式》,我觉得还挺好玩,虽然设计模式我这个阶段确实可以不着急学,但我觉得这些内容挺吸引我的,反正时间也还多,就学着玩玩。而且设计模式真的刷新了我对面向对象的认知,让我知道面向对象还可以这么灵活,还可以这么好玩,所以我觉得,作为后端的,使用面向对象语言(我学的是Java)进行程序设计,学会了这些,应该会对我编程更有帮助。

简单工厂模式概述

简单工厂模式是利用工厂类来实例化一系列对象,如此简化业务代码。

简单工厂模式由工厂角色、抽象产品角色、具体产品角色组成

使用简单工厂模式后,当需要对功能进行修改、增加、删除,主要的业务代码不需要改变:

  • 删除只需要在工厂角色中去除其实例化的代码,再删除其具体产品角色
  • 增加只需要创建一个具体产品角色,让其实现抽象产品角色的功能,再到工厂角色中增加其实例化的代码即可
  • 修改只需要在其具体产品角色中修改相应要修改的功能即可

以餐馆为顾客烹饪菜品为例:

若抽象产品角色为菜品,菜品的具体类型就是具体产品角色。对于餐馆来说,菜品的制作就是菜品的功能。

代码实现:

抽象产品角色(菜品):

/*** 抽象产品角色:菜品,用来表示烹饪,具体烹饪什么,要由实现类决定*/
public interface Cooking {//表示制作菜品String cookingDish(int id);
}

抽象产品角色的定义,要是一个抽象类或接口,以便于具体产品角色来继承或实现它。在其中也要定义具体产品角色必须实现的功能。

具体产品角色(菜品的具体种类):

public class CookingChicken implements Cooking {@Overridepublic String cookingDish(int id) {return "烹饪" + id + "号客户的鸡肉";}
}
public class CookingFish implements Cooking {@Overridepublic String cookingDish(int id) {return "烹饪" + id + "号顾客的鱼";}
}
public class CookingPotato implements Cooking {public String cookingDish(int id) {return "烹饪" + id + "号顾客的土豆";}
}

具体产品角色不要忘了去实现或继承抽象产品角色,并实现其功能。

工厂角色

/*** 简单工厂模式*//*** 工厂类,用其中的静态方法来创建具体的烹饪菜品的任务*/
public class CookingFactory {public static Cooking createCooking(String type) throws Exception {Cooking cooking = null;switch (type){case "鱼":cooking = new CookingFish();break;case "土豆":cooking = new CookingPotato();break;case "鸡肉":cooking = new CookingChicken();break;default:cooking = null;}if (cooking == null) {System.out.println("没有此菜品");throw new Exception("没有此菜品");}return cooking;}
}

创建具体产品角色的对象的方法应该是静态的,因为这个工厂创建的方法是一种可以统一用可以复用的功能,调用它就可以创建对应的具体产品角色。所以不必要先实例化工厂类的对象再调用其工厂方法,用静态方法能简化代码。

以上为例,工厂可以通过不同的type,来判断要创建哪个具体产品角色。在没有找到相应具体产品角色时,也做出相应的异常处理。

主要业务代码(具体使用):

public class Main {public static void main(String[] args) throws Exception {Scanner scan = new Scanner(System.in);System.out.println("输入用户id号");int id = scan.nextInt();System.out.println("输入要点的菜品");String dish = scan.next();Cooking cooking = CookingFactory.createCooking(dish);String result = cooking.cookingDish(id);System.out.println(result);}
}

要获得指定的具体产品角色,调用其工厂类的静态工厂方法,此处调用createCooking方法,并传入具体的菜品类型,就可以返回一个需要的具体产品角色,就可以调用其具体产品角色完成指定功能。

总结

  • 简单工厂模式使得主业务代码更为简洁,只需要传入动态的代表具体产品类型的值和调用相应的功能。
  • 动态判断的逻辑代码 和 健壮性处理 以及 对象的创建 都封装在底层中,主业务代码只要完成简单的调用即可
  • 使得整个项目耦合度低,封装性强,且层次分明,易于阅读。当需要对逻辑进行一些增加、修改、删除,只需要在底层中进行即可。

举的例子可能不是很形象,一些优点的总结也可能有点片面。如有误,望指出。

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

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

相关文章

Flink 架构深度解析

## 1. 引言 在当今的数据驱动世界中,实时数据处理变得越来越重要。Flink 提供了一个高性能、可扩展的平台,用于构建实时数据分析和处理应用。它支持事件时间处理和精确一次(exactly-once)处理语义,确保数据的准确性和…

Linux swapon命令教程:如何管理你的交换空间(附案例详解和注意事项)

Linux swapon命令介绍 swapon命令用于启用设备或文件中的交换空间。交换空间是当系统的物理内存不足时,系统会使用的一部分硬盘空间。 Linux swapon命令适用的Linux版本 swapon命令在大多数Linux发行版中都是可用的,包括Debian、Ubuntu、Alpine、Arch…

大模型在天体物理学研究中的辅助作用与案例分析

大模型在天体物理学研究中的辅助作用与案例分析 1. 背景介绍 天体物理学是研究宇宙中各种天体的物理性质和运动规律的科学。随着观测技术的进步,天体物理学家们获得了大量的数据,这些数据往往具有高维度、非线性、非平稳等特点,给传统的数据…

Struts2的工作原理是什么?Struts2中的MVC模式包含哪些核心组件?在Struts2中如何实现转发和重定向?

Struts2的工作原理是什么? Struts2的工作原理主要基于MVC设计模式,它充当Web应用框架的控制器层(Controller),负责建立模型与视图之间的数据交互。 具体来说,Struts2的工作流程如下: 启动与加…

自媒体用ChatGPT批量洗稿软件V5.9环境配置/软件设置教程【汇总】

大家好,我是淘小白~ 首先,感谢大家的支持~~ ChatGPT采集洗稿软件V5.9版本更新,此次版本更新修改增加了一些内容: 1、自定义多条指令,软件自动判断指令条数,进行输入 2、增加谷歌浏览多账号轮询&#xf…

ubuntu20.04 安装ros1

详细介绍如何在ubuntu20.04中安装ROS系统,超快完成安装(最新版教程)_ubuntu安装ros-CSDN博客Ros noetic : XTDrone安装-CSDN博客 gazebo11卸载,安装gazebo9 我的ROS学习日记-环境搭建 - 知乎 需要选择分支 GitHub - ros-simulat…

读算法的陷阱:超级平台、算法垄断与场景欺骗笔记18_竞争市场

1. 竞争市场 1.1. 算法、大数据、超级平台的风起云涌似乎预示了市场竞争机制的加速终结,而我们似乎也对这种市场机制的衰退见怪不怪 1.1.1. 它有效节省了消费者的搜寻成本,降低了市场准入壁垒,开辟了市场扩张与准入之间的崭新通道&#xff…

指针空值nullptr(C++11)

c98中的指针空值 在良好的C/C编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现不可预料的错误,比如未初始化的指针。如果一个指针没有合法的指向,我们基本都是按照如下方式对其进行初始化: void…

Spark-Scala语言实战(5)

在之前的文章中,我们学习了如何在scala中定义与使用集合和元组。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。 Spark-Scala语言实战(…

伪分布式部署Hive

文章目录 1 Hadoop 伪分布式安装1 Hive下载2 Hive配置3 安装MySQL JDBC连接器4 连接Hive CLI4.1 初始化数据库4.2 连接Hive 1 Hadoop 伪分布式安装 假设我们已经安装好hadoop伪分布式 1 Hive下载 Hive下载地址 2 Hive配置 Hive伪分布式需要在conf文件夹下修改两个文件&…

c++核心学习5

4.6继承 有些类与类之间存在特殊的关系,例如下图中: 我们发现,定义这些类时,下级别的成员除了拥有上一级的共性,还有自己的特性。这个时候我们就可以考虑利用继承的技术,减少重复代码 4.6.1继承的基本语法…

VTK9.2.0+Qt5.14.0 绘制点云

背景 为了显示结构光重建后的点云,开发QT5.14.0VTK9.2.0的上位机软件,用于对结构光3D相机进行控制,并接收传输回来的3D数据,显示在窗口中。 配置QT和VTK VTK9.2.0下载源码,用Cmake编译,编译好的VTK9.2.0…

去中心化的 AI 数据供应:认识Grass,参与Grass

去中心化的 AI 数据供应:认识Grass,参与Grass 👋:邀请链接☘️:Intro❓:看好Grass和即将推出的L2的原因有哪些?💡:展望🔍:总结 👋&…

说说webpack的构建流程?

文章目录 一、运行流程初始化流程编译构建流程compile 编译make 编译模块build module 完成模块编译 输出流程seal 输出资源emit 输出完成 二、小结参考文献 一、运行流程 webpack 的运行流程是一个串行的过程,它的工作流程就是将各个插件串联起来 在运行过程中会…

python学生作业管理系统flask-django-nodejs-php

课题主要分为三大模块:即管理员模块和学生、教师模块,主要功能包括:学生、教师、作业信息、学习模块、教学评价、学习情况等; 关键词:学生作业管理系统;作业信息 目录 摘 要 I Abstrac II 目录 III 1绪论 1…

5.84 BCC工具之tcpretrans.py解读

一,工具简介 tcpretrans工具追踪内核TCP重传函数,以显示这些重传的详细信息。 它专门用于追踪TCP重传事件。在网络通信中,重传是由于数据包丢失、损坏或延迟到达而需要重新发送的情况。tcpretrans通过利用Linux内核中的BPF(Berkeley Packet Filter)机制,能够实时捕获和…

matlab实现机器学习svm

一、目的和要求 1.编程实现SVM训练函数和预测函数; 2.绘制线性和非线性边界; 3.编写线性核函数 二、算法 1.线性svm: 分离超平面:wxb0,对于线性可分的数据集来说,这样的超平面有无穷多个(…

ARM32day4

VID_20240319_210515 1.思维导图 2.实现三个LED灯亮灭 .text .global _start _start: 使能GPIO外设时钟 LDR R0,0x50000A28 LDR R1,[R0]使能GPIOE ORR R1,R1,#(0X1<<4)使能GPIOF ORR R1,R1,#(0X1<<5) STR R1,[R0]设置引脚状态 LDR R0,0X50006000 LDR R1,[R0…

SQL:窗口函数之OVER()

窗口函数 通用格式 “函数 OVER (PARTITION BY 分组 ORDER BY 排序依据 升降序)”。 这里记录下OVER() 以及搭配LEAD/LAG函数的使用方法&#xff08;执行平台Impala&#xff09; 目录 OVER函数1、不加条件的OVER函数——得到所有的汇总结果2、仅有排序的OVER函数——得到按顺序…

基于NetCoreServer的WebSocket客户端实现群播(学习笔记)

一、NetCoreServer介绍 超快速、低延迟的异步套接字服务器和客户端 C# .NET Core 库&#xff0c;支持 TCP、SSL、UDP、HTTP、HTTPS、WebSocket 协议和 10K 连接问题解决方案。 开源地址&#xff1a;https://github.com/chronoxor/NetCoreServer 支持&#xff1a; Example: TC…