Java - 工厂设计模式

Java - 工厂设计模式

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

前言

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

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

一. 简介

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

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

优点:

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

二. 例子

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

接下来会讲解一下代码

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

2.1 定义抽象类

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

java 复制代码
/**
 * @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 抽象类)。

java 复制代码
/**
 * @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类

java 复制代码
/**
 * @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 创建工厂

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

java 复制代码
/**
 * @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 测试

java 复制代码
/**
 * 测试类
 *
 * @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);
    }
}

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

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

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

作者:神的孩子都在歌唱

本人博客:https://blog.csdn.net/weixin_46654114

转载说明:务必注明来源,附带本人博客连接。

相关推荐
她似晚风般温柔7896 分钟前
Uniapp + Vue3 + Vite +Uview + Pinia 分商家实现购物车功能(最新附源码保姆级)
开发语言·javascript·uni-app
从心归零6 分钟前
sshj使用代理连接服务器
java·服务器·sshj
咩咩大主教7 分钟前
C++基于select和epoll的TCP服务器
linux·服务器·c语言·开发语言·c++·tcp/ip·io多路复用
FuLLovers37 分钟前
2024-09-13 冯诺依曼体系结构 OS管理 进程
linux·开发语言
IT毕设梦工厂1 小时前
计算机毕业设计选题推荐-在线拍卖系统-Java/Python项目实战
java·spring boot·python·django·毕业设计·源码·课程设计
everyStudy2 小时前
JS中判断字符串中是否包含指定字符
开发语言·前端·javascript
luthane2 小时前
python 实现average mean平均数算法
开发语言·python·算法
Ylucius2 小时前
动态语言? 静态语言? ------区别何在?java,js,c,c++,python分给是静态or动态语言?
java·c语言·javascript·c++·python·学习
凡人的AI工具箱2 小时前
AI教你学Python 第11天 : 局部变量与全局变量
开发语言·人工智能·后端·python
sleP4o2 小时前
Python操作MySQL
开发语言·python·mysql