Java - 工厂设计模式

news2024/9/29 7:31:59

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();

    @Override
    public 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;
    }

    @Override
    public String memory() {
        return this.memory;
    }

    @Override
    public 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;
    }
    @Override
    public String memory() {
        return this.memory;
    }

    @Override
    public 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.coloradmin.cn/o/1333706.html

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

相关文章

复分析——第1章——复分析准备知识(E.M. Stein R. Shakarchi)

第一章 复分析准备知识 (Preliminaries to Complex Analysis) The sweeping development of mathematics during the last two centuries is due in large part to the introduction of complex numbers; paradoxically, this is based on the seemingly absurd no…

[机器人-3]:开源MIT Min cheetah机械狗设计(三):嵌入式硬件设计

目录 概述: 1、硬件组成 2、通信速率 3、通信协议 4、mbedOS 概述: 以1条腿进行设计,其它腿也一样: 腿部硬件组成 1、硬件组成 1)UP board计算机板卡(Linux OS): 腿部控制器…

YOLOv8改进 | 主干篇 | 利用SENetV2改进网络结构 (全网首发改进)

一、本文介绍 本文给大家带来的改进机制是SENetV2,其是2023.11月的最新机制(所以大家想要发论文的可以在上面下点功夫),其是一种通过调整卷积网络中的通道关系来提升性能的网络结构。SENet并不是一个独立的网络模型,而是一个可以和现有的任何…

ubuntuxu双系统安装+git/g++/vim+pytorch+opencv+yolo+sitl相关学习

multirotor The first day ——12.10 1.install vmware-workstation and ubuntu swap sources and 换输入法 2.learn git github关联远程仓库 3.install and use Typora Git codemeaningmkdir test创建目录cd test进入目录git init初始化仓库ls ;ls -ah查看目…

CGAL的三维点集

CGAL提供了几种处理点集的算法,从形状检测到通过标准点集处理工具进行的表面重建。 虽然这些算法不强制使用特定的数据结构,但该软件包提供了一个3D点集结构,使用户更容易处理附加属性,如法向量、颜色、标签,并在其上调…

ES的安装和RestClient的操作

目录 初识elasticsearch 什么是elasticsearch elasticsearch的发展 Lucene的优缺点 elasticsearch的优势 倒排索引 es与mysql的概念对比 文档 索引 概念对比 架构 安装es 安装kibana 安装ik分词器 分词器 安装ik分词器 ik分词器的拓展和停用词典 操作索引库…

【文本处理】正则表达式

一、简介 正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex、regexp或RE),是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符&…

工具系列:PyCaret介绍_编写和训练自定义机器学习模型

文章目录 PyCaret安装PyCaret👉 让我们开始吧👉 数据集👉 数据准备PyCaret中的设置函数👉 可用模型👉 模型训练与选择👉 编写和训练自定义模型👉 GPLearn模型👉 NGBoost 模型&#x…

半导体晶圆制造SAP:助力推动新时代科技创新

随着科技的迅猛发展,半导体行业成为了推动各行各业进步的重要力量。而半导体晶圆制造作为半导体产业链的核心环节,其效率和质量的提升对于整个行业的发展起着决定性的作用。在这个高度竞争的行业中,如何提升制造过程的效率、降低成本&#xf…

Bellman_Ford算法总结

知识概览 Bellman_Ford算法适合解决存在负权边的最短路问题,时间复杂度为O(nm)。在存在负权边的最短路问题中,Bellman_Ford算法的效率虽然不如SPFA算法,但是Bellman_Ford算法能解决SPFA算法不能解决的经过不超过k条边的最短路问题。 例题展示…

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

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

OpenGL 绘制Mesh数据(Qt)

文章目录 一、简介二、实现代码三、实现效果一、简介 Mesh数据的结构主要就是点与三角面片,因此本质上仍然是对三角面片进行绘制。这里我们借助VCG这个库实现对Mesh数据的读取,这个库相对简单轻巧,很方便使用。 二、实现代码 由于修改的部分很多,我们逐一进行解释一下: --…

快速入门学习定时任务框架-xxljob

定时任务框架-xxljob 简介 主要用于分布式任务调度,可以将任务调度和执行分布在多个节点上。它提供了一个集中式的管理平台,支持动态添加、修改、删除任务,以及任务的分片执行,确保任务在分布式环境中的高可用性的一个框架 spr…

【刷题篇】动态规划(八)

文章目录 1、最长定差子序列2、 最长的斐波那契子序列的长度3、最长等差数列4、等差数列划分 II - 子序列5、回文子串6、最长回文子串 1、最长定差子序列 给你一个整数数组 arr 和一个整数 difference,请你找出并返回 arr 中最长等差子序列的长度,该子序…

Python爬虫中文乱码处理实例代码解析

更多Python学习内容:ipengtao.com 大家好,我是彭涛,今天为大家分享 Python爬虫中文乱码处理实例代码解析。全文2800字,阅读大约8分钟 在进行网络数据抓取时,常常会遇到中文乱码的问题,这可能导致数据无法正…

编程规范:长函数的思考

在工作,我们应该都不想看到非常的长函数。对于一个运行5年左右的项目,极有可能出现这种情况。由于长函数的长、if/else嵌套,导致代码的可读性非常差,这对于项目的维护和开发带来了极大的困难。所以我们应该避免写长函数&#xff0…

基于稀疏表示的小波变换多光谱图像融合算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 小波变换融合 PCA融合 基于稀疏表示的小波变换多光谱图像融合算法 性能指标对比 2.算法运行软件版本 matlab2022a 3.部分核心程序 ...........…

Redis相关的那些事(一)

背景 目前工作所负责的工作主要是投放业务,属于读高并发场景,记录一下之前碰到的redis相关的问题。 热点大值Key&缓存击穿问题 问题表现 在某次流量峰值过程中,redis的CPU突然飙升,从监控看起来就是CPU飙升到一定程度&…

微信小程序(uniapp)api讲解

Uniapp是一个基于Vue.js的跨平台开发框架,可以同时开发微信小程序、H5、App等多个平台的应用。下面是Uniapp常用的API讲解: Vue.js的API Uniapp采用了Vue.js框架,因此可以直接使用Vue.js的API。例如:v-show、v-if、v-for、comput…

基于HC-SR04传感器的避障机器人设计与实现

本文介绍了如何设计和实现一个基于HC-SR04超声波传感器的避障机器人。我们将详细讨论硬件和电路连接,并提供完整的Arduino代码。该机器人可以利用超声波传感器检测周围的障碍物,并采取相应的动作进行避障,实现自主导航。 引言: 避…