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

时间:2018-03-05 11:26:42

标签: design-patterns factory factory-pattern

Erich Gamma的GOF设计模式书说:

enter image description here

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

enter image description here

似乎一个应用程序可以创建多个文档 在什么情况下,我将需要使Application类抽象然后从它派生?

2 个答案:

答案 0 :(得分:1)

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

任何将对象创建延迟到其需要使用的对象的子类的类都可以看作是工厂模式的一个例子。

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

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

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

代码的可能结构如下所示。

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
}  

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

答案 1 :(得分:0)

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