Java - 工厂设计模式
2023-12-24 23:19:29
前言
这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱
工厂设计模式广泛应用于 JDK 以及 Spring等框架中。
一. 简介
当我们有一个带有多个子类的超类,并且根据输入,我们需要返回其中一个子类时,就会使用工厂设计模式。该模式将类实例化的步骤从客户端程序转移到工厂类。
简单理解就是一个东西有多种不同的实现方式,你选择不同方式,最后的结果就会不一样
优点:
- 工厂设计模式提供了接口而不是实现的代码方法。
- 工厂模式从客户端代码中删除了实际实现类的实例化。工厂模式使我们的代码更加健壮,耦合性更低并且易于扩展。例如,我们可以轻松地更改 PC 类的实现,因为客户端程序不知道这一点。
- 工厂模式通过继承提供实现类和客户端类之间的抽象。
二. 例子
假如我们要做一个电脑购买系统,里面有台式机(PC)和笔记本(laptop),并且在购买的时候可以选择内存(memory)和磁盘(disk)两个参数。那么我们就可以使用工厂模式进行设计,如下图
接下来会讲解一下代码
是不是感觉很简单,其实这种简单的工厂模式反而更像是一种编程习惯,我们在开发过程中都有使用到
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;
}
}
}
注意:
- 我们可以保留 Factory 类 Singleton ,也可以将返回子类的方法保留为static。
- 根据输入不同参数类型,创建并返回不同的子类。
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);
}
}
三. JDK中使用工厂模式的案例
这是网上搜到的,有空可以去研究一下这些jdk源码,方便加深理解
- java.util.Calendar、ResourceBundle 和 NumberFormat
getInstance()
方法使用工厂模式。 valueOf()
包装类中的方法,如 Boolean、Integer 等。
作者:神的孩子都在歌唱
本人博客:https://blog.csdn.net/weixin_46654114
转载说明:务必注明来源,附带本人博客连接。
文章来源:https://blog.csdn.net/weixin_46654114/article/details/135187412
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!