工厂模式

一、概述

1.1 什么是工厂设计模式?

工厂设计 是 Java 开发中使用最多的一种设计模式,工厂模式是什么?有什么用?我们先看一段程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 代码来源:《 Java 开发实战经典 》

interface Fruit { // 定义一个水果的接口
public void eat(); // 吃水果的方法
}

class Apple implements Fruit { // 定义子类 Apple
public void eat() { // 覆写 eat() 方法
System.out.println("** 吃苹果");
}
}

class Orange implements Fruit { // 定义子类 Orange
public void eat() { // 覆写 eat() 方法
System.out.println("** 吃橘子");
}
}

public class InterfaceCaseDemo {
public static void main(String args[]) {
Fruit f = new Apple(); // 实例化接口
f.eat(); // 调用方法
}
}

执行后,我们可以得到结果:

1
** 吃苹果

1.2 工厂设计

我们对代码进行更改:

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
// 代码来源:《 Java 开发实战经典 》

interface Fruit { // 定义一个水果的接口
public void eat(); // 吃水果的方法
}

class Apple implements Fruit { // 定义子类 Apple
public void eat() { // 覆写 eat() 方法
System.out.println("** 吃苹果");
}
}

class Orange implements Fruit { // 定义子类 Orange
public void eat() { // 覆写 eat() 方法
System.out.println("** 吃橘子");
}
}

class Factory { // 定义工厂类
public static Fruit getInstance(String className) {
Fruit f = null; // 定义接口对象
if ("apple".equals(className)) { // 判断是哪个子类的标记
f = new Apple(); // 通过 Apple 类实例化接口
}
if ("orange".equals(className)) { // 判断是哪个子类的标记
f = new Orange(); // 通过 Apple 类实例化接口
}
return f;
}
}

public class InterfaceCaseDemo {
public static void main(String args[]) {
Fruit f = null; // 定义接口对象
f = Factory.getInstance("apple"); // 通过工厂取得实例
f.eat(); // 调用方法
}
}

执行后,我们可以得到结果:

1
** 吃苹果

程序的运行结果与之前的一样,但是取得实例的过程不一样,我们可以发现接口对象的实例是通过工厂取得的,这样如果再有子类扩充,直接修改工厂类就行,然后根据标记取得相应的实例,灵活性高。

工厂模式是一种创建型模式,降低了对象之间的耦合度,它其实就是一个创建对象的接口,实例化的任务交由子类去完成。