【问题标题】:What are the practical uses of Factory Method Pattern?工厂方法模式的实际用途是什么?
【发布时间】:2009-04-15 13:53:49
【问题描述】:

我对设计模式很陌生。我刚刚遇到了工厂设计模式。我知道它将实例化委托给子类。但我没有得到该模式的实际应用。这种模式在哪些场景可以使用效果好。我听说过模式滥用,不想沉迷其中。任何人都可以提及一个常用的现实世界示例。

【问题讨论】:

    标签: design-patterns


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      即两种情况之一:

      1. 您的类不知道它想要创建的对象类型,但它只想要一个能够“完成工作”的对象。由于 EMF 大量使用了这种模式,因此我们会想到它。
      2. 您希望类的子类确定要使用的对象的类型。即,您正在编写父类而不知道将创建什么具体产品,这将是具体创建者的责任。

      【讨论】:

        【解决方案3】:

        假设您有一个包含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】:

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              猜你喜欢
              • 2019-03-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-09-09
              • 2011-04-02
              • 2019-05-17
              • 2015-04-22
              • 2021-07-22
              相关资源
              最近更新 更多