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


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


2838
2018-04-15 13:53


起源



答案:


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


3
2018-04-15 14:00





假设您有一个包含类型对象的队列 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;
  }
}

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

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


4
2018-04-15 14:01



如果没有专门用于实例化的课程,你仍然可以做同样的事情吗? - BKSpurgeon


答案:


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


3
2018-04-15 14:00





假设您有一个包含类型对象的队列 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;
  }
}

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

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


4
2018-04-15 14:01



如果没有专门用于实例化的课程,你仍然可以做同样的事情吗? - BKSpurgeon


即在两种情况之一:

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

3
2018-04-15 14:12





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

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


2
2018-04-15 13:59





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


1
2018-04-15 14:03





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


-2
2018-04-15 14:01