设计模式(2)——工厂方法模式
本文介绍工厂方法模式的概念和应用。
# 基本思想和原则
定义一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法模式使一个类的实例化延迟到其子类。
客户代码不要依赖具体类,而是要依赖抽象。
# 动机
假设某个类有两个个子类 A、B,当需要客户代码需要使用这个类体系时,最简单的方式是根据需要的功能选择相应的子类来创建对象。但是这么做有一个问题,当子类很多时或子类的初始化比较复杂时,客户代码会严重地依赖子类的具体实现。比如客户代码可能是下面这样的(为了简单起见,代码写在了一起):
public abstract class GameConsole {
public void play() {}
}
public class PlayStation extends GameConsole {
@Override
public void play(){
System.out.println("PlayStation play!");
}
}
public class XBox extends GameConsole {
@Override
public void play(){
System.out.println("XBox play!");
}
}
public class Main {
public static void main(String[] args) {
GameConsole playstation = new PlayStation();
playstation.play();
GameConsole xbox = new XBox();
xbox.play();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
这里客户代码要直接和具体的游戏机类发生耦合,创建一个游戏机实例都要关注到具体的游戏机类。如果之后游戏机种类增加,客户代码还需要自行做一些判断。
使用工厂方法可以缓解这种问题,下面是工厂方法的实现。
# 实现
public interface IGameConsole {
public void play();
}
public class PlayStation implements IGameConsole {
@Override
public void play() {
System.out.println("PlayStation play!");
}
}
public class XBox implements IGameConsole {
@Override
public void play() {
System.out.println("XBox play!");
}
}
public class GameConsoleFactory {
public static IGameConsole getGameConsole(String name) {
if (name.equalsIgnoreCase("playstation")) {
return new PlayStation();
} else if (name.equalsIgnoreCase("xbox")) {
return new XBox();
} else {
return null;
}
}
}
public class Test {
public static void main(String[] args) {
IGameConsole playstation = GameConsoleFactory.getGameConsole("playstation");
playstation.play();
IGameConsole xbox = GameConsoleFactory.getGameConsole("xbox");
xbox.play();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
运行后输出:
PlayStation play!
XBox play!
1
2
2
在工厂方法中,我们将游戏机这个概念抽象成一个接口IGameConsole
,其中有一个方法play
。具体的游戏机类PlayStation
和XBox
通过实现IGameConsole
接口实现了自己的逻辑。另外需要建立一个GameConsoleFactory
工厂类,这个工厂类的作用就是为客户代码提供一种创建具体类实例的入口,注意GameConsoleFactory.getGameConsole
是一个静态方法。此时客户代码不需要了解具体的游戏机实现类,只要知道IGameConsole
接口为我们提供了什么方法就可以了。之后如果增加新的游戏机类,只需要修改GameConsoleFactory.getGameConsole
,客户代码不用改动。
# 优点
# 缺点
编辑 (opens new window)
上次更新: 2024-07-15, 03:27:09