Java 设计模式02——工厂方法模式

模式定义

定义一个创建对象的的接口,然后不同类型的对象提供该接口不同的实现,对象的具体实现交给接口的具体实现类去完成。

模式示例

下面以我们常见的文档处理为例,来说明工厂方法模式。

  1. 定义文档接口:文档支持打开操作和关闭操作。
  2. 创建文档:我们要创建两种类型文档,pdf格式文档和txt格式文档
  3. 定义一个工厂接口,提供一个创建文档的方法。
  4. 提供pdf文档和txt文档的工厂接口实现。
  5. 定义Client来检验模式的运行结果。

具体代码

文档接口的定义:支持打开关闭操作

1
2
3
4
public interface Document {
void open();
void close();
}

文档类的定义:PdfDocument.javaTxtDocument.java

1
2
3
4
5
6
7
8
9
10
11
12
public class PdfDocument implements Document {

@Override
public void open() {
System.out.println("Open the PdfDocument");
}

@Override
public void close() {
System.out.println("Close the pdfDocument");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
public class TxtDocument implements Document {

@Override
public void open() {
System.out.println("Open the TxtDocument");
}

@Override
public void close() {
System.out.println("Close the TxtDocument");
}
}

定义工厂类:DocumentFactory.java

1
2
3
public abstract class DocumentFactory {
public abstract Document create();
}

定义工厂类子类,分别来创建两种类型的文档:PdfFactory.javaTxtFactory.java

1
2
3
4
5
6
7
8
9
public class PdfFactory extends DocumentFactory {

@Override
public Document create() {
Document pdf = new PdfDocument();
System.out.println("Create the PdfDocument");
return pdf;
}
}
1
2
3
4
5
6
7
8
9
10
public class TxtFactory extends DocumentFactory {

@Override
public Document create() {
Document txt = new TxtDocument();
System.out.println("Create the TxtDocument");
return txt;
}
}

定义Client来检验模式运行的结果:FactoryClient.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class FactoryClient {
public static void main(String args[]) {
DocumentFactory documentFactory = new TxtFactory();
Document document = documentFactory.create();

document.open();
document.close();

DocumentFactory documentFactory1 = new PdfFactory();
Document document1 = documentFactory1.create();
document1.open();
document1.close();
}
}

模式总结

在总结之前,先来看看简单工厂模式的实现方式

  1. 定义文档接口:文档支持打开操作和关闭操作。
  2. 创建文档:我们要创建两种类型文档,pdf格式文档和txt格式文档
  3. 定义简单工厂类,根据要创建的文档类型穿件不同文档

SimpleDocumentFactory.java

1
2
3
4
5
6
7
8
9
10
11
12
13
public class SimpleDocumentFactory {
public static final int DOC_TYPE_TXT = 0;
public static final int DOC_TYPE_PDF = 1;

public static Document create(int docType) {
if (docType == DOC_TYPE_PDF) {
return new PdfDocument();
} else if (docType == DOC_TYPE_TXT) {
return new TxtDocument();
}
return new TxtDocument();
}
}

可以看到,与简单工厂模式相比,工厂方法模式不需要关心具体怎么创建对象的逻辑,但工厂方法模式多了许多的工厂实现类,即:

  1. 工厂方法模式解决了简单工厂模式中创建逻辑都在工厂类的问题(即新增文档类型不需要直接更改工厂类),但针对每一个新的文档类型,都要创建一个与之对应的工厂类,增加了类的个数。
  2. 简单工厂模式违背了开放封闭原则,新增产品(文档)是需要修改工厂类,而工厂方法模式解决了这个问题,它不需要修改工厂方法,只需要添加产品(文档)和产品对应的工厂即可。
  3. 工厂方法模式对外屏蔽了对象的创建操作,只需要执行相应工厂的创建方法即可得到对象。