在 Java 中使用泛型实现工厂模式 | baeldung


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

Notifier接口是一个泛型接口:

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

正如我们所见,  Notifier类是一个通用类,它有一个名为 notify的方法。

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

public class StringNotifier implements Notifier<String> {

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


public class DateNotifier implements Notifier<Date> {

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

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

每次调用工厂类唯一的方法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 是一个枚举,有两个名为STRING和DATE的常量。

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();
}

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


让我们在主类中使用工厂:

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

如我们所见,工厂已成功创建了两个适当类型的通知程序实例。

源代码可在 GitHub 上获得。