工厂方法 - 应用程序 class 是否需要抽象?

Factory method - Does application class need to be abstract?

Erich Gamma 的 GOF 设计模式书说:

而单词应用程序可以自己创建多个文档,如下所示:

看来一个应用程序可以创建多个文档。
在什么情况下,我需要将 Application class 抽象化,然后从中派生?

常见的情况是应用程序和文档摘要 类 由您使用的框架(例如 Swing 或 UIKit 或 Gnome)提供,您自己的代码会将它们实现为 MyDocument 和 MyApplication .

应用程序class抽象不是工厂模式的本质,但我们需要看到它背后的意图。抽象插件 class(在下面的示例实现中)实现了相同的意图。

任何 class 将对象创建推迟到其子 class 以获取它需要使用的对象可以看作是工厂模式的示例.

GOF 中描述的工厂模式提供了一个可能实现文档应用程序的示例以供理解,但并不特定于特定的 Word 应用程序,但我们仍然可以有一个可能的 factory method 基于设计

对于当前的 Word 应用程序,可能的设计可能类似于基于插件的设计,我们可以有多个插件,每个插件都可以添加到应用程序中。实体(在本例中为文档)创建由每个插件完成。

如果需要一种新型文档,则可以实施插件并将其添加到应用程序中。

代码的可能结构如下。

Class Application{
    List<Plugin> plugins ;
    public void addPlugin(Plugin newPlugin){
       plugins.add(newPlugin);
    }
    //more code as per req and features
}

 public abstract class Plugin{
    public abstract Document createNewDocument();
    public void openNewDocument(){
         Document doc = createNewDocument();
         doc.open();// assuming open is a method in Document interface.
           //more code as per req and features
    }
 }

public class PNGPlugin extends Plugin{
     public Document createNewDocument(){
          return new PNGDocument();// Document being the interface for various documents.
     }
       //more code as per req and features
}  

在当前方法中,菜单项将取决于插件列表。