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

时间:2009-04-15 13:53:49

标签: design-patterns

我是Design Patterns的新手。我刚遇到了Factory Design Pattern。我知道它将实例化委托给子类。但我没有得到该模式的实际应用。在哪种情况下,可以使用此模式产生良好效果。我听说过模式滥用,不想沉迷于此。任何人都可以提到一个常用的真实世界的例子。

6 个答案:

答案 0 :(得分:4)

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

现在,您可以出于各种原因对task进行子类化。如果从某个源(如数据库)加载任务,则可以使用工厂确定要加载的任务类型。

例如:

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

稍后您可以在队列中的任务上调用虚拟方法,例如“使用”或“进程”。

工厂方法(在这种情况下)的优点是你只需要打开一次任务类型(创建任务时),并让多态处理其他所有方法。

答案 1 :(得分:4)

即2例之一:

  1. 你的类不知道它想要创建的对象的类型,但它只是想要一个“完成工作”的对象。 EMF因为大量使用这种模式而跳入脑海。
  2. 您希望类的子类确定要使用的对象的类型。即,您在编写父类而不知道将创建具体产品的情况下,这将由具体创建者负责。

答案 2 :(得分:3)

我已经将它用于应用程序的插件......这样你就可以让你的主应用程序调用类工厂来实例化实现你在主应用程序中开发的某个界面的特定插件。这样,您就可以编写应用程序的主要部分,而无需知道要插入的内容。

答案 3 :(得分:2)

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

..但有很多用途,以及使用方式..这种模式。

答案 4 :(得分:1)

不可否认,由于C#的工作方式,实际使用模式描述的更痛苦的实现细节的需要已被删除,但我的SQL DAL功能将对象工厂(和SQL命令)传递给使用工厂的实用程序函数为了生成对象。如果我没有使用C#,我想我可以使用生成对象的显式工厂类。

答案 5 :(得分:-2)

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