Java设计模式之工厂方法模式详解

Java设计模式之工厂方法模式详解

大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!在今天的篇章中,我们将深入探讨Java设计模式中的一种魔法,那就是工厂方法模式。通过详细解析这个“魔法工厂”,揭示其中的设计艺术,助你在代码世界中释放更多创造力。

什么是工厂方法模式?

工厂方法模式是一种创建型设计模式,其主要目的是定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。这种模式在创建对象的超类中有一个创建对象的接口,让子类决定将哪个类实例化。

工厂方法模式的优势

  • 降低耦合性: 将产品的实例化过程与使用过程解耦,客户端不需要知道具体产品的类名,只需知道具体工厂即可。
  • 增加扩展性: 添加新的产品类时,只需要添加相应的具体产品类和对应的具体工厂类,无需修改已有代码。
  • 符合开闭原则: 对扩展开放,对修改关闭。

如何实现工厂方法模式

简单工厂模式(静态工厂方法)

public interface Product {void produce();
}public class ConcreteProductA implements Product {@Overridepublic void produce() {System.out.println("生产产品A");}
}public class ConcreteProductB implements Product {@Overridepublic void produce() {System.out.println("生产产品B");}
}public class SimpleFactory {public static Product createProduct(String type) {if ("A".equals(type)) {return new ConcreteProductA();} else if ("B".equals(type)) {return new ConcreteProductB();}throw new IllegalArgumentException("Invalid product type");}
}

工厂方法模式

public interface Factory {Product createProduct();
}public class ConcreteFactoryA implements Factory {@Overridepublic Product createProduct() {return new ConcreteProductA();}
}public class ConcreteFactoryB implements Factory {@Overridepublic Product createProduct() {return new ConcreteProductB();}
}

工厂方法模式的实际应用技巧

灵活扩展产品族

工厂方法模式在创建产品族时非常灵活,可以轻松扩展新的产品类别。

public interface Factory {Product createProduct();// 扩展新的产品族Product createSpecialProduct();
}public class ConcreteFactoryA implements Factory {@Overridepublic Product createProduct() {return new ConcreteProductA();}@Overridepublic Product createSpecialProduct() {return new SpecialProductA();}
}public class ConcreteFactoryB implements Factory {@Overridepublic Product createProduct() {return new ConcreteProductB();}@Overridepublic Product createSpecialProduct() {return new SpecialProductB();}
}

使用抽象工厂模式

抽象工厂模式是工厂方法模式的一种变种,它在创建产品族时更加灵活,可以创建多个不同产品的产品族。

public interface AbstractFactory {Product createProduct();SpecialProduct createSpecialProduct();
}public class ConcreteFactoryA implements AbstractFactory {@Overridepublic Product createProduct() {return new ConcreteProductA();}@Overridepublic SpecialProduct createSpecialProduct() {return new SpecialProductA();}
}public class ConcreteFactoryB implements AbstractFactory {@Overridepublic Product createProduct() {return new ConcreteProductB();}@Overridepublic SpecialProduct createSpecialProduct() {return new SpecialProductB();}
}

工厂方法模式的典型应用场景

日志记录器

在日志记录器中,不同类型的日志记录器可以由不同的日志记录器工厂负责创建。

public interface LoggerFactory {Logger createLogger();
}public class FileLoggerFactory implements LoggerFactory {@Overridepublic Logger createLogger() {return new FileLogger();}
}public class DatabaseLoggerFactory implements LoggerFactory {@Overridepublic Logger createLogger() {return new DatabaseLogger();}
}

数据库连接池

在数据库连接池中,可以由不同的连接池工厂负责创建不同类型的数据库连接

池。

public interface ConnectionPoolFactory {ConnectionPool createConnectionPool();
}public class OracleConnectionPoolFactory implements ConnectionPoolFactory {@Overridepublic ConnectionPool createConnectionPool() {return new OracleConnectionPool();}
}public class MySQLConnectionPoolFactory implements ConnectionPoolFactory {@Overridepublic ConnectionPool createConnectionPool() {return new MySQLConnectionPool();}
}

UI控件库

在UI控件库中,可以由不同的控件工厂负责创建不同类型的UI控件。

public interface UIControlFactory {Button createButton();TextBox createTextBox();
}public class WindowsUIControlFactory implements UIControlFactory {@Overridepublic Button createButton() {return new WindowsButton();}@Overridepublic TextBox createTextBox() {return new WindowsTextBox();}
}public class LinuxUIControlFactory implements UIControlFactory {@Overridepublic Button createButton() {return new LinuxButton();}@Overridepublic TextBox createTextBox() {return new LinuxTextBox();}
}

结语

通过本文的详细解析,我们深入了解了Java设计模式中的工厂方法模式。这个“魔法工厂”在代码的世界中发挥着不可替代的作用,不仅能够降低耦合性、增加扩展性,还能够在产品族的创建上展现出出色的灵活性。让我们在代码的创造过程中,充分发挥工厂方法模式的设计魅力,打造更为优雅、高效的代码!

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

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

相关文章

C语言/c++指针详细讲解【超详细】【由浅入深】

指针用法简单介绍 指针,是内存单元的编号。 内存条分好多好多小单元,一个小单元有 8 位,可以存放 8 个 0 或 1;也就是说,内存的编号不是以位算的,而是以字节算的,不是一个 0 或 1 是一个编号&…

函数 - JS

基本语法 function 关键字;函数名,应简明扼要且具有描述性,没有函数名就是匿名函数;参数列表,个数≥0,小括号不能省略;函数体。 /* 基本语法 */ function 函数名(参数) { 函数体 }声明与调用 …

立体视觉几何(一)

1.什么是立体视觉几何 立体视觉对应重建: • 对应:给定一幅图像中的点pl,找到另一幅图像中的对应点pr。 • 重建:给定对应关系(pl, pr),计算空间中相应点的3D 坐标P。 立体视觉:从图像中的投影恢复场景中点…

list下

文章目录 注意:const迭代器怎么写?运用场合? inserterase析构函数赋值和拷贝构造区别?拷贝构造不能写那个swap,为什么?拷贝构造代码 面试问题什么是迭代器失效?vector、list的区别? 完整代码 注…

React16源码: React中的reconcileChildIterator和reconcileChildrenArray的源码实现

reconcileChildIterator 和 reconcileChildrenArray 1 )概述 在react更新某一个节点的时候,要根据这个节点,它的类型去获取它的children比如说如果是 Function Component,它要调用这个 component 计算出它的return的属性return的…

qt学习:QT对话框+颜色+文件+字体+输入

目录 概述 继承图 QColorDialog 颜色对话框 QFileDialog 文件对话框 保存文件对话框 QFontDialog 字体对话框 QInputDialog 输入对话框 概述 对于对话框的功能,在GUI图形界面开发过程,使用是非常多,那么Qt也提供了丰富的对话框类QDia…

网络:FTP

1. FTP 文件传输协议,FTP是用来传输文件的协议。使用FTP实现远程文件传输的同时,还可以保证数据传输的可靠性和高效性。 2. 特点 明文传输。 作用:可以从服务器上下载文件,或将本地文件上传到服务器。 3. FTP原理 FTP有控制层面…

坦克大战游戏代码

坦克大战游戏 主函数战场面板开始界面坦克父类敌方坦克我方坦克子弹爆炸效果数据存盘及恢复图片 主函数 package cn.wenxiao.release9;import java.awt.event.ActionEvent; import java.awt.event.ActionListener;import javax.swing.JFrame; import javax.swing.JMenu; impor…

RS-485通讯

RS-485通讯协议简介 与CAN类似,RS-485是一种工业控制环境中常用的通讯协议,它具有抗干扰能力强、传输距离远的特点。RS-485通讯协议由RS-232协议改进而来,协议层不变,只是改进了物理层,因而保留了串口通讯协议应用简单…

Java设计模式之抽象工厂模式详解

Java设计模式之抽象工厂模式详解 大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!在今天的篇章中,我们将探索Java设计模式的一种奇妙魔法——抽象工厂模式…

【HarmonyOS】掌握布局组件,提升应用体验

从今天开始,博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”,对于刚接触这项技术的小伙伴在学习鸿蒙开发之前,有必要先了解一下鸿蒙,从你的角度来讲,你认为什么是鸿蒙呢?它出现的意义又是…

【RT-DETR有效改进】华为 | GhostnetV2移动端的特征提取网络效果完爆MobileNet系列

前言 大家好,这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进,内容持续更新,每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本,同时修改内容也支持ResNet32、ResNet101和PP…

QGraphicsView 如何让图形大小适配窗口

1. setSceneRect 做什么用? setSceneRect是一个Qt中的函数,用于设置QGraphicsView中的场景矩形(QRectF)。 QGraphicsView是一个用于显示和编辑图形场景的控件,而setSceneRect函数用于设置场景矩形,即指定…

自动控制原理——数学模型建立

目标 1.数学模型概念 描述系统输入、输出变量以及内部个变量之间的关系的数学表达式 2.建模方法 解析法(机理解析法): 根据系统工作所依据的物理定律写运动方程 实验法(系统辨识法): 给系统施加某种测试信号&am…

万户 ezOFFICE wf_process_attrelate_aiframe.jsp SQL注入漏洞复现

0x01 产品简介 万户OA ezoffice是万户网络协同办公产品多年来一直将主要精力致力于中高端市场的一款OA协同办公软件产品,统一的基础管理平台,实现用户数据统一管理、权限统一分配、身份统一认证。统一规划门户网站群和协同办公平台,将外网信息维护、客户服务、互动交流和日…

Intel开发环境Quartus、Eclipse与WSL的安装

PC :win10 64bit 安装顺序:先安装Quartus 21.4,接着Eclipse或者WSL(Windows Subsystem for Linux),Eclipse与WSL的安装不分先后。 为什么要安装Eclipse? 因为Eclipse可以开发基于Nios II的C/…

SwiftUI 框架有哪些主要优势

SwiftUI是苹果公司在2019年推出的一种用于构建用户界面的框架,它使用Swift语言编写,并且与iOS、iPadOS、macOS、watchOS和tvOS等平台兼容。下面简单的看下有哪些主要的优势。 声明式的界面描述 使用声明式编程风格,通过简洁的代码描述用户界…

力扣645.错误的集合

一点一点地刷,慢慢攻克力扣!! 王子公主请看题 集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数…

C++:基于C的语法优化

C:基于C的语法优化 命名空间命名空间域域作用限定符展开命名空间域 输入输出缺省参数全缺省参数半缺省参数 函数重载参数类型不同参数个数不同参数类型的顺序不同 引用基本语法按引用传递返回引用引用与指针的区别 内联函数autoauto与指针和引用结合 范围for循环nul…

红队打靶练习:W34KN3SS: 1

目录 信息收集 1、arp 2、nmap 3、nikto 4、gobuster 5、dirsearch WEB web信息收集 目录探测 漏洞利用 openssl密钥碰撞 SSH登录 提权 get user.txt get passwd 信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan -l Interface: eth0, type: EN10MB…