工厂模式与抽象工厂模式
如有错误或有补充,以及任何的改进意见,请在评论区留下您的高见
工厂模式
工厂模式是一种创建型设计模式。在工厂模式中,类的实例化过程通常是通过一个专门的工厂类来完成的,而不是直接在客户端代码中进行的。这样可以提供更好的封装,使得客户端代码与具体产品的实现解耦,增加代码的灵活性和可维护性。
优点
封装性:客户端代码不再需要知道所创建对象的详细信息,只需要与工厂接口进行交互即可。
灵活性:工厂模式使得系统更加灵活,可以在不修改客户端代码的情况下更换或添加新产品。
可扩展性:通过使用工厂模式,当需要添加新产品时,只需要扩展工厂类,而不需要修改客户端代码。
基本结构
抽象产品(Abstract Product):这是要创建的对象的抽象接口。
具体产品(Concrete Product):实现了抽象产品接口的具体类。
具体工厂(Concrete Factory):负责创建具体产品对象。
应用场景
当一个类不知道它所必须创建对象的类时:例如,你可能需要根据输入参数的不同来创建不同的对象。
当一个类希望其子类决定它所创建的对象时:例如,你希望提供一种方法让子类来自定义对象的创建过程。
当一个类希望通过子类来指定它所创建的对象时:在这种情况下,你可以将“创建对象”的职责委托给子类,而不是直接在父类中完成。
示例
假设我们有一个场景,其中需要创建不同的小动物,包括小狗,小猫。此时就可以使用工厂模式。
Animal.java
public interface Animal {void eat();
}
AnimalFactroy.java
public class AnimalFactory {public Animal getAnimal(String name) {if (name == null){return null;}// 根据不同的输入返回不同对象if ("dog".equals(name)) {return new Dog();} else if ("cat".equals(name)) {return new Cat();}return null;}
}
Cat.java
public class Cat implements Animal{@Overridepublic void eat() {System.out.println("吃鱼"); }
}
Dog.java
public class Dog implements Animal{@Overridepublic void eat() {System.out.println("吃骨头");}
}
Demo.java
public class Demo {public static void main(String[] args) {AnimalFactory animalFactory = new AnimalFactory();Cat cat = (Cat) animalFactory.getAnimal("cat");cat.eat();Animal dog = animalFactory.getAnimal("dog");dog.eat();}
}
运行Demo.java输出如下
吃鱼
吃骨头
抽象工厂模式
优点
封装性:客户端代码不再需要知道所创建对象的详细信息,只需要与抽象工厂接口进行交互即可。
灵活性:通过使用抽象工厂模式,可以在不修改客户端代码的情况下更换或添加新产品族。
多态性:客户端代码可以使用同一个接口来创建不同类型的产品对象,增强了代码的复用性。
基本结构
抽象产品(Abstract Product):这是要创建的对象的抽象接口。
具体产品(Concrete Product):实现了抽象产品接口的具体类。
抽象工厂(Abstract Factory):创建产品的工厂的抽象接口。
具体工厂(Concrete Factory):实现了抽象工厂的类,负责创建具体产品对象。
应用场景
当一个系统中有多个产品族,并且希望客户端代码使用同一个接口来创建不同产品族的对象时:使用抽象工厂模式可以将不同产品族的创建逻辑封装在各自的具体工厂中,使得客户端代码与具体产品实现解耦。
当希望在不修改客户端代码的情况下更换或添加新产品族时:通过扩展具体工厂类来添加新产品族,而不需要修改客户端代码。
当希望对一个系统中的多个产品族进行独立配置时:使用抽象工厂模式可以将配置逻辑集中到具体工厂中,使得客户端代码更加简洁。
示例
我们有不同的类Object需要生成,于是我们把工厂也抽象出来,为每一个类设置不同的工厂,再让这些工厂去继承同一个接口。
Total.java
public class Total {public static void main(String[] args) {com.hacoj.abstract_factory_pattern.PatternFactory patternFactory = (com.hacoj.abstract_factory_pattern.PatternFactory) com.hacoj.abstract_factory_pattern.FactoryProducer.getFactory("Pattern");com.hacoj.abstract_factory_pattern.ColorFactory colorFactory = (com.hacoj.abstract_factory_pattern.ColorFactory) com.hacoj.abstract_factory_pattern.FactoryProducer.getFactory("Color");com.hacoj.abstract_factory_pattern.Pattern circle = patternFactory.getPattern("circle");com.hacoj.abstract_factory_pattern.Pattern rectangle = patternFactory.getPattern("rectangle");com.hacoj.abstract_factory_pattern.Color red = colorFactory.getColor("red");com.hacoj.abstract_factory_pattern.Color blue = colorFactory.getColor("blue");circle.show();rectangle.show();red.show();blue.show();}
}class FactoryProducer {public static com.hacoj.abstract_factory_pattern.AbstractFactory getFactory(String name) {if (name==null) {return null;}if ("Pattern".equals(name)) {return new PatternFactory();} else if ("Color".equals(name)) {return new com.hacoj.abstract_factory_pattern.ColorFactory();} else {System.out.println("没有对应的厂子");return null;}}
}interface AbstractFactory {}interface Pattern {void show();
}interface Color {void show();
}class Circle implements Pattern {@Overridepublic void show() {System.out.println("这是圆形");}
}class Blue implements Color {@Overridepublic void show() {System.out.println("这是蓝色");}
}class Rectangle implements com.hacoj.abstract_factory_pattern.Pattern {@Overridepublic void show() {System.out.println("这是方形");}
}class Red implements com.hacoj.abstract_factory_pattern.Color {@Overridepublic void show() {System.out.println("这是红色");}
}class ColorFactory implements com.hacoj.abstract_factory_pattern.AbstractFactory {public com.hacoj.abstract_factory_pattern.Color getColor(String name) {if (name==null){return null;}if ("red".equals(name)){return new Red();} else if ("blue".equals(name)) {return new com.hacoj.abstract_factory_pattern.Blue();} else {System.out.println("Invalid color");return null;}}
}class PatternFactory implements com.hacoj.abstract_factory_pattern.AbstractFactory {public com.hacoj.abstract_factory_pattern.Pattern getPattern(String name) {if (name == null) {return null;}if ("rectangle".equals(name)) {return new Rectangle();} else if ("circle".equals(name)) {return new com.hacoj.abstract_factory_pattern.Circle();} else {System.out.println("Invalid pattern");return null;}}
}
区别
普通工厂模式仅用于创建单个对象,而抽象工厂模式可以创建一类对象。抽象工厂模式更灵活,可维护性和可扩展性更强,适用于多个产品等级结构。
相关文章:
工厂模式与抽象工厂模式
如有错误或有补充,以及任何的改进意见,请在评论区留下您的高见 工厂模式 工厂模式是一种创建型设计模式。在工厂模式中,类的实例化过程通常是通过一个专门的工厂类来完成的,而不是直接在客户端代码中进行的。这样可以提供更好的…...

Springboot整合Websocket实现ws和wss连接
1. 引入pom依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId><version>2.7.10</version> </dependency>2. 新建websocket配置文件 import org.springf…...

CSC联合培养博士申请亲历|联系外导的详细过程
在CSC申报的各环节中,联系外导获得邀请函是关键步骤。这位联培博士同学的这篇文章,非常详细且真实地记录了申请过程、心理感受,并提出有益的建议,小编特推荐给大家参考。 2024年国家留学基金委公派留学项目即将开始,其…...

没有外网Nginx如何配置如何开启https
判断是否支持open-ssl 在服务器执行如下命令 openssl version没有则安装open-ssl,由于服务器没有外网,可以离线安装openssl-3.0.1.tar.gz,我是在有网的服务器直接下载的,然后再上传到这台无网的服务器上 wget https://www.open…...

【Docker篇】Linux安装Docker、docker安装mysql、redis、rabbitmq
1.Linux安装docker 官方帮助文档:Install Docker Engine on CentOS | Docker Docs 1.1安装命令 # 1. 卸载之前的dockersudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate…...

WPF应用程序(.Net Framework 4.8) 国际化
1、新建两个资源字典文件zh-CN.xaml和en-US.xaml,分别存储中文模板和英文模板 (1) zh-CN.xaml <ResourceDictionary xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml&q…...

Elasticsearch:Geoshape query
Geoshape 查询可以用于过滤使用 geo_shape 或 geo_point 类型索引的文档。 geo_shape 查询使用与 geo_shape 或 geo_point 映射相同的索引来查找具有与查询形状相关的形状的文档,并使用指定的空间关系:相交(intersect)、包含(con…...

安装配置sqoop
一、了解Sqoop 1、Sqoop产生的原因 A. 多数使用hadoop技术的处理大数据业务的企业,有大量的数据存储在关系型数据中。 B. 由于没有工具支持,对hadoop和关系型数据库之间数据传输是一个很困难的事。 以上是sqoop产生的主要原因,也因此Sqoop主要用于hadoop与关系型数据库之…...

数据结构——实验01-线性表的链式存储和操作
一、实验内容 二、算法思想与算法实现 1、解题思想 (1)逆序创建链表La就是使用头插法创建一个链表,所谓头插法就是在创建链表时始终将新元素插入到头结点之后,而正序创建链表Lb就是使用尾插法创建一个链表,所谓尾插法…...

十分钟上手vue!
Vue 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。无论是简单还是复杂的界面,Vue 都可以胜任。 一 vue.js的导入及使用 vue安装…...

day37WEB攻防-通用漏洞XSS跨站权限维持钓鱼捆绑浏览器漏洞
目录 XSS-后台植入 Cookie&表单劫持(权限维持) 案例演示 XSS-Flash 钓鱼配合 MSF 捆绑上线 1、生成后门 2、下载官方文件-保证安装正常 3、压缩捆绑文件-解压提取运行 4、MSF 配置监听状态 5、诱使受害者访问 URL-语言要适当 XSS-浏览器网马…...

【Java程序设计】【C00215】基于SSM的勤工助学管理系统(论文+PPT)
基于SSM的勤工助学管理系统(论文PPT) 项目简介项目获取开发环境项目技术运行截图 项目简介 这个一个基于SSM的勤工助学管理系统,本系统共分为三种权限:管理员、教师和学生 管理员:首页、个人中心、教师管理、学生管理…...

c#的反汇编对抗
文章目录 前记nim攻防基础FFI内存加载加解密、编码 后记C#类型转换表nim基础 前记 随便编写一个c#调用winapi并用vs生成dll,同时用csc生成exe using System; using System.Runtime.InteropServices; namespace coleak {class winfun{[DllImport("User32.dll")]publ…...

设计模式之框架源码剖析(实战+图解)
Java设计模式 1,概述 随着软件开发人员人数的增多,一些公司急需一些高端人才。作为一个高端人才,设计面向对象软件是必不可少的能力,而软件设计是需要很深的功力,设计模式就要求你必须掌握。 2,本章特色…...

SQL注入:sqli-labs靶场通关(1-37关)
SQL注入系列文章: 初识SQL注入-CSDN博客 SQL注入:联合查询的三个绕过技巧-CSDN博客 SQL注入:报错注入-CSDN博客 SQL注入:盲注-CSDN博客 SQL注入:二次注入-CSDN博客 SQL注入:order by注入-CSDN博客 …...

浙政钉(专有钉钉)
专有钉钉是浙政钉的测试版本,可在正式发布之前进行业务开发。 专有钉钉 原名政务钉钉 是高安全、强管控、灵活开放的面向大型组织专有独享的协同办公平台。支持专有云、混合云等多种方式灵活部署,以满足客户特定场景所需为目标,最大化以“平…...

【lesson2】定长内存池的实现
文章目录 介绍定长内存池的设计定长内存池的实现需要成员变量需要的成员函数定长内存池结构定长内存池Delete(释放空间)的实现定长内存池New(申请空间)的实现 定长内存池的实现完整版 介绍 作为程序员(C/C)我们知道申请内存使用的…...

C++迷宫游戏详解
个人主页:[PingdiGuo_guo] 收录专栏:[C干货专栏] 大家好呀,我是PingdiGuo_guo,今天我们来学习用C实现一个迷宫游戏。 目录 1.迷宫的具体步骤 1.1.迷宫的初始化 1.2.寻路算法 1.DFS算法 2.BFS算法 1.3.移动 2.总结 C迷宫游…...
java下载网络文件
/*** 下载文件** param fileId* param response* throws Exception*/ GetMapping("/downLoadFile") public void downLoadFile(Long fileId, HttpServletResponse response) throws Exception{// 根据文件ID查询文件路径FileDO fileDO fileService.get(fileId);// 定…...

大数据信用报告查询费用一般要多少钱?
一些不少朋友在申贷的时候被拒贷之后,得到的原因就是因为大数据不良被拒,这时候很多人都反过来查询自己的大数据信用报告,而查询的价格也是不少朋友都比较关注的,那大数据信用报告查询费用一般要多少钱呢?下面本文就为你介绍一下…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...

MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...

push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...