在面向对象编程中,工厂模式是一种创建型设计模式,它负责在调用时创建对象。
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 上获得。