Java23种设计模式-创建型模式之工厂方法模式

工厂方法模式(Factory Method Pattern)
一种创建型设计模式,它定义了一个用于创建对象接口,让子类决定将哪一个类实例化,从而将产品的实例化推迟到子类中。这种模式的主要角色包括:

角色1:抽象工厂(Abstract Factory)。它是工厂方法模式的核心,与应用程序无关,提供了创建产品的接口
角色2:具体工厂(Concrete Factory)。它是实现抽象工厂接口的具体工厂类,负责创建具体的产品对象。
角色3:抽象产品(Product)。它是所有对象的超类,定义了产品的规范,描述了产品的共同主要特性和功能
角色4:具体产品(Concrete Product)。它是实现了抽象产品角色所定义的接口的具体对象,由专门的具体工厂来创建。

工厂方法模式优点包括:
用户需要知道具体工厂的名称,就可以得到想要的产品无需知道产品的具体创建过程
系统的灵活性增强,对于新产品的创建,只需多写一个相应的工厂类。
高层模块只需知道产品抽象类,关心其他实现类,这满足了迪米特法则、依赖倒置原则和里里氏替换原则
工厂方法模式的缺点包括:
类的个数可能过多增加了系统的复杂度理解难度
如果抽象产品只能生产一种产品,这可能成为一个限制。
工厂方法模式适用于以下场景
客户不关心创建产品的细节只关心创建产品的工厂名
一个类通过其子类指定创建哪个产品对象
这种模式是在简单工厂模式上改进,核心工厂类不再负责所有产品的构建,而是将具体的工作交给子类进行实现,不再接触业务相关具体细节
示例:
定义了一个Shape接口和实现了Shape接口的具体类Circle。然后定义一个工厂类ShapeFactory,它可以根据参数创建不同类型的Shape对象

//定义形状接口
public interface Shape {void draw();
}//圆形类(具体产品实现)
public class Circle implements Shape{@Overridepublic void draw() {System.out.println("Circle::draw()");}
}
//工厂方法类--根据产品给对象实例化
public class ShapeFactory {public static Shape getShape(String shapeType){if (shapeType==null){return null;}if (shapeType.equalsIgnoreCase("CIRCLE")){return new Circle();}//这里可以添加更多的形状和对应的条件判断return null;}
}
//测试类
public class FactoryPatternDemo {public static void main(String[] args) {Shape circle =ShapeFactory.getShape("CIRCLE");if (circle!=null){circle.draw();}//这里可以添加更多的形状测试}
}

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

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

相关文章

内核技术解析

GitHub - floesen/KExecDD: Admin to Kernel code execution using the KSecDD driver https://security.stackexchange.com/questions/270383/how-does-the-av-inject-their-own-dll-in-each-new-process

spdlog 日志库部分源码说明——让你可以自定义的指定自动切换日志时间

前言 针对 网络上spdlog日志库目前存在的使用方式固定,不能发挥这个库本身应有价值的情况,这里对一些支持场景进行说明,以供初学者省去阅读源码的时间,直接上手使用 涉及源码 在说明过程中使用spdlog库自身提供的使用说明示例&…

Coursera: An Introduction to American Law 学习笔记 Week 03: Property Law

An Introduction to American Law 本文是 https://www.coursera.org/programs/career-training-for-nevadans-k7yhc/learn/american-law 这门课的学习笔记。 文章目录 An Introduction to American LawInstructors Week 03: Property LawKey Property Law TermsSupplemental Re…

主从模式与AI大模型的结合

主从模式是一种分布式计算的模式,其中一个节点作为主节点负责接收和分发任务,其他节点作为从节点负责执行任务并将结果返回给主节点。AI大模型是指参数量非常庞大的人工智能模型,如深度学习的神经网络模型。 将主从模式与AI大模型结合可以实…

Revit二次开发环境Addin和Lookup配置快速上手教程

一、背景 经常有小伙伴被开发环境的配置难倒,总不能让这些兄弟倒在第一步吧,骑士特意做了一个傻瓜式的教学,希望对初学者有所帮助! 二、教程 Revit开发利器Addin和RevitLookup快速安装教学 https://www.bilibili.com/video/BV1…

vue实现弹窗的动态导入(:is=“dialogName“)

组件的动态挂载 弹窗aaa.vue <template><el-dialogwidth"700px "v-dialog-outdestroy-on-closev-if"dialogVisible":title"title":visible"dialogVisible":before-close"hideDialog":close-on-click-modal"…

多功能气象传感器解析

TH-WQX5多功能气象传感器在监测要素上越来越丰富。除了传统的温度、湿度、风速、风向等基本气象要素外&#xff0c;现代的多功能气象传感器还能够监测降雨量、大气压力、光照强度、紫外线强度、土壤温湿度等多种参数。这些数据的获取&#xff0c;使得农业生产者能够更全面地了解…

【计算机系统】

常用的寄存器%rsp、%rip、%rdi、%rsi、%rax有什么特殊作用 %rsp&#xff1a;保存栈顶地址%rip&#xff1a;保存下一条将要被执行的指令的内存地址%rdi&#xff1a;函数第一个参数传参%rsi&#xff1a;函数第二个参数传参%rax&#xff1a;保存函数返回值 程序GDB、GCC、OBJDUMP、…

redisson有几种分布式算法

Redisson 提供了多种分布式锁算法&#xff0c;以适应不同的应用场景和需求。其中一些常见的分布式锁算法包括&#xff1a; 可重入锁&#xff08;Reentrant Lock&#xff09;&#xff1a; 可重入锁允许同一个线程多次获取锁&#xff0c;每次获取后计数器加 1&#xff0c;释放锁…

4款值得推荐的AI辅助编程工具(支持C#语言)

前言 在这个AI迅速发展的阶段&#xff0c;涌现出了一大批好用的AI辅助编程工具。AI辅助编程工具能够提高开发效率、改善代码质量、降低bug率&#xff0c;是现代软件开发过程中的重要助手。今天大姚给大家分享4款AI辅助编程工具&#xff08;并且都支持C#语言&#xff09;&#x…

ChromaDB教程

使用 Chroma DB&#xff0c;管理文本文档、将文本嵌入以及进行相似度搜索。 随着大型语言模型 &#xff08;LLM&#xff09; 及其应用的兴起&#xff0c;我们看到向量数据库越来越受欢迎。这是因为使用 LLM 需要一种与传统机器学习模型不同的方法。 LLM 的核心支持技术之一是…

Linux 文件/目录管理(头歌实训)

目录 任务描述 相关知识 Linux 创建文件 Linux 删除文件 编程要求 测试说明 任务描述 相关知识 Linux 创建目录 Linux 删除目录 编程要求 测试说明 任务描述 相关知识 Linux 拷贝文件 Linux 重命名文件 编程要求 测试说明 任务描述 相关知识 Linux 拷贝目…

初入数据库

SQL&#xff1a;操作关系型数据库的编程语言&#xff0c;定义了一套操作关系型数据库的统一标准。 DDL&#xff08;Data Definition Language&#xff09;数据定义语言 数据库 show databases;create database db01;use db01;select database(); 显示当前使用的数据库drop d…

Springboot的Test单元测试操作

Springboot的Test单元测试操作 简单总结需要操作的步骤 1&#xff0c;导入依赖 2&#xff0c;创建目录&#xff08;目录和启动类的目录保持一致&#xff09; 3&#xff0c;添加注解 4&#xff0c;写方法测试 1&#xff0c;导入依赖 <dependency><groupId>org.spri…

(八)小案例银行家应用程序-排序-数组排序

排序一直有很多的算法&#xff0c;今天我们仅仅来说JavaScript内置的排序方法 ● 字符串 const owners [Jonas, Zach, Adam, Martha]; console.log(owners.sort()); console.log(owners);但是注意&#xff0c;这个方法会改变原有的数组&#xff1b; ● 我们在试试数字 cons…

使用excel文件生成sql脚本

目录 1、excel文件脚本变量2、公式示例 前言&#xff1a;在系统使用初期有一些基础数据需要从excel中导入到数据库中&#xff0c;直接导入的话可能有些字段用不上&#xff0c;所以就弄一个excel生成sql的导入脚本&#xff0c;这样可以将需要的数据填到指定的列即可生成sql。 1、…

BootLooder引导传参和镜像编译

引导传参 所传数据结构必须约定一至 引导程序与内核之间必须约定一个参数存放的地址DDR Base+0x100 数据格式约定一至 比如用户传给内核的参数: 1 bootargs root =/ dev / mmcblk0p8 rw rootfstype = ext4 init =/ linuxrc lcd = wy070ml tp = gslx680 参数数据结构及…

很多事情不是有意义了才做,而是因为做了才有意义

引言 我们常常陷入一个误区&#xff0c;认为只有当一件事情被普遍认为有意义时&#xff0c;我们才会去做。然而&#xff0c;真正的意义往往来源于行动本身。本文将探讨如何通过行动来发现和创造个人生活和工作的意义&#xff0c;以及如何通过日常行为来确定自己的人生方向。 …

探索AI大模型在央国企的落地实践|爱分析活动

在这个人工智能技术迅猛发展的时代&#xff0c;AI大模型在央国企的落地实践正成为推动数字化转型和智能化升级的重要引擎。为了深入探讨AI大模型在央国企的应用场景、技术挑战与落地路径&#xff0c;爱分析邀请到一家头部互联网公司作为本次闭门研讨会的联合主办方&#xff0c;…

美国网站服务器解决方案

在当今互联网时代&#xff0c;网站是企业宣传、营销和销售的最好方式&#xff0c;因此&#xff0c;选择一个适合自己企业的网站服务器解决方案很重要。美国作为全球网络基础设施最发达的国家之一&#xff0c;其网站服务器解决方案具有以下特点&#xff1a; 一、安全性高 作为全…