1. 概述

在这个教程中,我们将学习如何在Java中使用泛型实现工厂模式。

2. 什么是工厂模式?

在面向对象编程中,工厂模式是一种创建型设计模式,它负责在被调用时创建对象。

工厂是一个类,通过方法调用来创建原型类(接口)的对象:

当需要为用户隐藏创建逻辑,同时提供一个通用接口来创建对象时,工厂模式非常有用。

3. 如何实现?

现在让我们学习如何实现。首先,看看类图:

接下来,我们来实现图中的每个类。

3.1. 实现Notifier接口

Notifier接口是原型,其他通知器类都实现了它:

public interface Notifier<T> {
    void notify(T obj);
}

如图所示,Notifier类是一个泛型类,它有一个名为notify的方法。

3.2. 实现Notifier

现在我们实现另外两个通知器类:

public class StringNotifier implements Notifier<String> {

    @Override
    public void notify(String str) {
        System.out.println("Notifying: " + str);
    }
}

现在我们有了两个使用Notifier接口的类 - 一个用于输出简单文本,另一个用于发布日期。

3.3. 实现工厂

工厂类在其唯一方法getNotifier()被调用时生成一个通知器实例:

public class NotifierFactory {

    public <T> Notifier<T> getNotifier(Class<T> c) {
        if (c == String.class) {
            return Record.STRING.make();
        }
        if (c == Date.class) {
            return Record.DATE.make();
        }
        return null;
    }

}

在这段代码中,Record是一个枚举,包含两个常量STRINGDATE

3.4. 实现Record

Record枚举维护有效通知器类的记录,并在工厂类调用时创建实例:

public enum Record {
    STRING {
        @Override
        public Notifier<String> make() {
            return new StringNotifier();
        }
    },
    DATE {
        @Override
        public Notifier<Date> make() {
            return new DateNotifier();
        }
    };

    public abstract <T> Notifier<T> make();
}

我们成功地实现了工厂模式。

4. 使用工厂

Main类中使用工厂:

public static void main(String[] args) {
    NotifierFactory factory = new NotifierFactory();
    Notifier<String> stringNotifier = factory.getNotifier(String.class);
    Notifier<Date> dateNotifier = factory.getNotifier(Date.class);

    stringNotifier.notify("Hello world!");
    dateNotifier.notify(new Date());
}

现在我们应该编译并运行我们的代码:

$ javac Main.java
$ java Main
Notifying: Hello world!
Notifying: Wed Oct 19 17:36:38 TRT 2022

可以看到,工厂已成功创建了两个适当类型的通知器实例。

5. 总结

在这篇文章中,我们学习了如何在Java中实现和使用工厂模式。

如往常一样,源代码可以在GitHub上找到。