创建型-工厂模式

前言

​ 为了写出更“优雅”的代码,遂准备来学习JAVA的设计模式。

​ 以前从来没有写文章的习惯,发现学过的东西容易忘记,也可能是学的过于表面,不够深入,了解了费曼学习法,决定开始码文章,当作学习记录吧,也方便回顾。

设计模式

​ JAVA的设计模式分为三类,创建型模式(关注对象的创建机制)、结构性模式(关注类和对象之间的组合)、行为型模式(关注对象之间的通信以及责任的分配)

简单工厂模式

1
2
3
4
5
6
7
8
9
10
11
12
13
public abstract class Fruit { //水果抽象类
protected final String name;

protected Fruit(String name) {
this.name = name;
}

@Override
public String toString() {
return name +"@"+hashCode();
}
}

1
2
3
4
5
6
7
public class Apple extends Fruit { //继承水果

public Apple() {
super("苹果");
}
}

1
2
3
4
5
6
7
8
public class Orange extends Fruit {	//继承水果

public Orange() {
super("橘子");
}
}


1
2
3
4
5
6
7
8
9
10
11
12
13
public class SimplefruitFactory { //水果工厂
public static Fruit getFruit(String type) {
switch (type) {
case "苹果":
return new Apple();
case "橘子":
return new Orange();
default:
return null; // 处理未知类型
}
}
}

1
2
3
4
5
6
public class Main {
public static void main(String[] args) {
Fruit fruit = SimplefruitFactory.getFruit("橘子"); //通过工厂创建
System.out.println(fruit);
}
}

​ 这样做的好处是,比如Apple的构造方法需要新的参数,我们只需要修改工厂里面的参数,因为其他地方是通过工厂获得的水果的实例。

假如现在需要增加一个新的水果类型,就需要对工厂进行修改。这不符合开闭原则。(开闭原则:一个软件实体,比如类、模块和函数应该对扩展开放,对修改关闭)。

工厂模式

1
2
3
public abstract class FruitFactory <T extends Fruit>{ //将水果工厂抽象为抽象类,通过泛型指定水果类型
public abstract T getFruit(); //不同的水果工厂,生产不同的水果
}
1
2
3
4
5
6
7
8
public class AppleFactora extends FruitFactory<Apple>{ //假如需要苹果就创建一个苹果工厂类,新增橘子,蓝莓,等等同理

@Override
public Apple getFruit() {
return new Apple();
}
}

1
2
3
4
5
6
public class Main {
public static void main(String[] args) {
Apple fruit = new AppleFactora().getFruit();
System.out.println(fruit);
}

​ 屏蔽了对象的创建细节,使用者只需要关心如何使用对象,降低了客户端与对象之间的耦合度。


创建型-工厂模式
https://sp4rks3.github.io/2024/05/03/JAVA设计模式/工厂模式/
作者
Sp4rks3
发布于
2024年5月3日
许可协议