Factory Method Pattern的实际用途是什么?

What are the practical uses of Factory Method Pattern?

我对设计模式很陌生。我刚遇到工厂设计模式。我理解它将实例化委托给子类。但是我没有得到这个模式的实际应用。在哪些情况下,可以使用此模式来获得良好的效果。我听说过模式滥用,不想沉迷其中。有人能提到一个现实世界中常用的例子吗?


即在两种情况中的一种:

  • 你的类不知道它要创建的对象的类型,但它只需要一个"完成任务"的对象。当EMF大量使用这种模式时,它突然想到了这一点。
  • 您希望类的子类确定要使用的对象类型。也就是说,您编写父类时不知道将创建什么具体产品,这将是具体创建者的责任。

  • 假设有一个队列包含task类型的对象。

    现在,由于各种原因,您可以将task子类化。如果要从数据库之类的源加载任务,可以使用工厂来确定要加载的任务类型。

    例如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    private IEnumerable<Task> GetTasks(DataTable Table){

      Task NewTask;

      foreach(DataRow Row in Table){
        switch(tasktype){
          case tasktypes.TaskTypeA:
            NewTask = NewTaskA(...);
            break;

          case TaskTypes.TaskTypeB:
            NewTask = NewTaskB(...);
            break;
          ...
        }

        yield return NewTask;
      }
    }

    稍后,您可以对队列中的任务调用虚拟方法,例如"consume"或"process"。

    工厂方法的优点(在本例中)是,您只需要打开一次任务类型(在创建任务时),让多态性处理大多数其他事情。


    我用它作为应用程序的插件…这样,您就可以让您的主应用程序调用类工厂来实例化实现您在主应用程序中开发的某些接口的特定插件。这样,您就可以对应用程序的主要部分进行编码,而无需知道将插入什么。


    我只是在调度应用程序中使用它,其中要调度的任务在单独的程序集中,而调度程序对任务一无所知…它从外部源获取任务定义的程序集的名称,然后动态加载程序集,使用定义良好的接口在该程序集中实例化类。调度程序中以程序集名称作为输入参数的工厂方法返回加载程序集中类的实例…

    …但是有很多用途和使用方法。这种模式。


    诚然,由于C的工作方式,对模式描述的更痛苦的实现细节的实际使用的需求被消除了,但是我的SQL DAL功能将对象工厂(和SQL命令)传递给使用工厂来生成对象的实用函数。如果我没有使用C,我想我可以使用一个生成对象的显式工厂类。


    工厂模式对于将容量映射到适当的处理程序非常有用。