Java - 工厂设计模式

Java - 工厂设计模式

    • 一. 简介
    • 二. 例子
      • 2.1 定义抽象类
      • 2.2 定义子类
      • 2.3 创建工厂
      • 2.4 测试
    • 三. JDK中使用工厂模式的案例

前言

这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱

工厂设计模式广泛应用于 JDK 以及 Spring等框架中。

一. 简介

当我们有一个带有多个子类的超类,并且根据输入,我们需要返回其中一个子类时,就会使用工厂设计模式。该模式将类实例化步骤客户端程序转移到工厂类

简单理解就是一个东西多种不同的实现方式,你选择不同方式,最后的结果就会不一样

优点:

  1. 工厂设计模式提供了接口而不是实现的代码方法。
  2. 工厂模式从客户端代码中删除了实际实现类的实例化。工厂模式使我们的代码更加健壮,耦合性更低并且易于扩展。例如,我们可以轻松地更改 PC 类的实现,因为客户端程序不知道这一点。
  3. 工厂模式通过继承提供实现类和客户端类之间的抽象。

二. 例子

假如我们要做一个电脑购买系统,里面有台式机(PC)和笔记本(laptop),并且在购买的时候可以选择内存(memory)和磁盘(disk)两个参数。那么我们就可以使用工厂模式进行设计,如下图

image-20231224211149766

接下来会讲解一下代码

是不是感觉很简单,其实这种简单的工厂模式反而更像是一种编程习惯,我们在开发过程中都有使用到

2.1 定义抽象类

工厂设计模式中的超类可以是接口、抽象类或 普通的java类。这里我定义了一个电脑抽象类重写 toString() 方法方便测试。

/*** @author chenyunzhi* @date 2023/12/24 20:39* @description 电脑抽象类*/
public abstract class Computer {/*** 内存抽象方法* @return string*/public abstract String memory();/*** 磁盘抽象方法* @return string*/public abstract String disk();@Overridepublic String toString() {return "内存:" + memory() + "  " + "磁盘:" + disk();}
}

2.2 定义子类

我们有两个子类 PC 和 laptop,实现如下(注意,这两个类都继承了Computer 抽象类)。

/*** @author chenyunzhi* @date 2023/12/24 20:48* @description 台式机*/
public class Pc extends Computer{private final String memory;private final String disk;public Pc(String memory, String disk) {this.memory = memory;this.disk = disk;}@Overridepublic String memory() {return this.memory;}@Overridepublic String disk() {return this.disk;}
}

Laptop类

/*** @author chenyunzhi* @date 2023/12/24 20:52* @description 笔记本电脑*/
public class Laptop extends Computer{private final String memory;private final String disk;public Laptop(String memory, String disk) {this.memory = memory;this.disk = disk;}@Overridepublic String memory() {return this.memory;}@Overridepublic String disk() {return this.disk;}
}

2.3 创建工厂

现在我们已经准备好了超类和子类,就可以可以编写工厂类了。

/*** @author chenyunzhi* @date 2023/12/24 20:56* @description 电脑工厂*/
public class ComputerFactory {/*** 获取电脑* @param type 电脑类型* @param memory 内存* @param disk 磁盘* @return*/private static final String PC = "pc";private static final String LAPTOP = "laptop";public static Computer getComputer(String type, String memory, String disk) {if (PC.equals(type)) {return new Pc(memory, disk);} else if (LAPTOP.equals(type)) {return new Laptop(memory, disk);} else {return null;}}}

注意:

  1. 我们可以保留 Factory 类 Singleton ,也可以将返回子类的方法保留为static
  2. 根据输入不同参数类型,创建并返回不同的子类。getComputer是工厂方法。

2.4 测试

/*** 测试类** @author chenyunzhi* @date 2023/12/24 21:02*/
public class Test {public static void main(String[] args) {Computer pc = ComputerFactory.getComputer("pc", "16 GB", "1 TB");Computer laptop = ComputerFactory.getComputer("laptop", "32 GB", "512 GB");System.out.println("pc电脑 = " + pc);System.out.printf("laptop电脑 = " + laptop);}
}

image-20231224212158217

三. JDK中使用工厂模式的案例

这是网上搜到的,有空可以去研究一下这些jdk源码,方便加深理解

  1. java.util.Calendar、ResourceBundle 和 NumberFormatgetInstance()方法使用工厂模式。
  2. valueOf()包装类中的方法,如 Boolean、Integer 等。

作者:神的孩子都在歌唱
本人博客:https://blog.csdn.net/weixin_46654114
转载说明:务必注明来源,附带本人博客连接。

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

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

相关文章

useRef语法讲解

useRef useRef 用法 import { useRef, useState } from react import ./App.cssfunction App() {const userRef useRef<HTMLInputElement>(null)const [val, setVal] useState()const handleClick () > {userRef.current?.focus()setVal(userRef.current?.valu…

RPN网络在图像处理中的应用

RPN&#xff08;Region Proposal Network&#xff0c;区域建议网络&#xff09;是深度学习中用于目标检测的关键组件之一&#xff0c;它通常与后续的目标检测网络&#xff08;如Fast R-CNN、Faster R-CNN等&#xff09;结合使用。RPN的主要作用是生成候选目标区域&#xff0c;从…

nodejs+vue+微信小程序+python+PHP的旅游景点推荐系统-计算机毕业设计推荐

本课题的主要内容包括管理员和用户两个部分&#xff0c;管理员负责旅游相关信息的管理&#xff0c;包括景点信息、用户的预订信息以及用户信息的管理&#xff1b;正是采用计算机技术和网络设计的新型系统&#xff0c;可以有效的把旅游信息与网络相结合&#xff0c;为用户提供旅…

1 手写第一个Win32窗口程序

1 基础概念 什么是窗口&#xff1f; 答&#xff1a;窗口就是屏幕上的一片区域&#xff0c;接受用户的输入&#xff0c;显示程序的输出。可以包含标题栏、菜单栏、工具栏以及控件等。什么是句柄&#xff1f; 答&#xff1a; 作为一种管理和操作系统资源的机制&#xff0c;提供了…

基于IPP-FFT的线性调频Z(Chirp-Z,CZT)的C++类库封装并导出为dll(固定接口支持更新)

上一篇分析了三种不同导出C++类方法的优缺点,同时也讲了如何基于IPP库将FFT函数封装为C++类库,并导出为支持更新的dll库供他人调用。 在此基础上,结合前面的CZT的原理及代码实现,可以很容易将CZT变换也封装为C++类库并导出为dll,关于CZT的原理和实现,如有问题请参考: …

【动态规划】11简单多状态 dp 问题_按摩师_C++(easy)

题目链接&#xff1a;leetcode按摩师 目录 题目解析&#xff1a; 算法原理 1.状态表示 2.状态转移方程 3.初始化 4.填表顺序 5.返回值 编写代码 题目解析&#xff1a; 题目让我们求按摩师找到最优的预约集合&#xff08;总预约时间最长&#xff09; 由题可得&#xff…

大数据深度解析NLP文本摘要技术:定义、应用与PyTorch实战

文章目录 大数据深度解析NLP文本摘要技术&#xff1a;定义、应用与PyTorch实战1. 概述1.1 什么是文本摘要&#xff1f;1.2 为什么需要文本摘要&#xff1f; 2. 发展历程2.1 早期技术2.2 统计方法的崛起2.3 深度学习的应用2.4 文本摘要的演变趋势 3. 主要任务3.1 单文档摘要3.2 …

TomcatHttp协议

1 javaWEB 1.1 Web概述 Web在英文中的含义是网状物&#xff0c;网络。在计算机领域&#xff0c;它通常指的是后者&#xff0c;即网络。像我们前面接触的WWW&#xff0c;它是由3个单词组成的&#xff0c;即&#xff1a;World Wide Web&#xff0c;中文含义是万维网。而我们前…

基于Java SSM框架实现医院挂号上班打卡系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现医院挂号上班打卡系统演示 摘要 在网络发展的时代&#xff0c;国家对人们的健康越来越重视&#xff0c;医院的医疗设备更加先进&#xff0c;医生的医术、服务水平也不断在提高&#xff0c;给用户带来了很大的选择余地&#xff0c;而且人们越来越追求更个…

linux:IP地址、修改主机名、域名解析、虚拟机配置固定IP

一:IP地址 1、每一台联网的电脑都会有一个地址&#xff0c;用于和其它计算机进行通讯 2、IP地址主要有2个版本,V4版本和V6版本(V6很少用暂不涉及) 3、IPv4版本的地址格式是:a.b.c.d,其中abcd表示0~255的数字,如192.168.88.101就是一个标准的IP地址 4、可以通过命令:ifconfi…

产品设计 之 创建完美产品需求文档的4个核心要点

客户描述他们想要的产品和最终交付的产品之间的误解一般很大&#xff0c;设计者和客户的角度不同&#xff0c;理解的程度也不同&#xff0c;就需要一个统一的交流中介。这里包含PRD。 为了说明理解误差的问题。下面这张有趣的图画可以精准阐述。 第一张图片展示了客户所描述…

java进阶(二)-java小干货

java一些精干知识点分享 2. java小干货2.1循环遍历2.2可变参数2.3 list和数组转化2.3.1 数组转list2.3.2 list转数组 2.4 值传递和地址传递2.4.1值传递2.4.2 地址传递2.4.3易错点总结 2.5 数组数组帮助类Arrays 2.5 基本数据类型和包装类2.5集合2.6文件流2.7java代码块、内部类…