【问题标题】:When to use factory method何时使用工厂方法
【发布时间】:2020-12-01 04:48:54
【问题描述】:

我知道这个问题已经被问过很多次了,但是我还有一个很简单的问题,如果一个对象的初始化很简单,那么使用工厂方法的目的是什么。

Interface Animal{
    eat();
}

class Dog implements Animal{

     public void eat(){System.out.println("dog eat");}
}

假设我有一个具体的 Cat 类和 fish 类实现 Animal 接口。

那么在这种情况下,是否有必要制作 3 工厂来创造动物?我想我们只在初始化困难的时候才使用工厂方法。

【问题讨论】:

  • 工厂将客户端与具体实现分离。松散耦合是目的。
  • @jaco0646 但是在这种情况下,客户会与工厂耦合,而混凝土动物也会与工厂耦合,我没有看到工厂如何减少耦合。
  • 工厂模式是什么意思?有人说Factory Pattern,其实并没有什么设计模式叫Factory Pattern。在设计模式中,有Factory MethodAbstract Factory等类似名称。你是什​​么意思?
  • @AliSoltani 我的意思是工厂方法,我会编辑帖子
  • 这能回答你的问题吗? Applicability for the Factory Method Pattern

标签: design-patterns factory-pattern


【解决方案1】:

没有。如果初始化很困难,您可以使用构建器模式。

工厂模式(工厂方法和抽象工厂)的目的是从抽象层中删除创建。如果您在同一级别上有相关的课程,这通常很重要。

例如:IHttpRequest -> HttpRequestWithOnlyParsedHeaders -> HttpRequestFullyParsed

在代理或转移请求时可以使用第一类。在这种情况下,解析内容并为其分配对象是一种资源浪费。

因此,当要发回回复时,您不希望手动创建响应对象,因为这会生成如下内容:

if (request is HttpRequestWithOnlyParsedHeaders)
    return new HttpResponseWithOnlyHeaders;
else 
    return new HttpResponseWithContent;

该代码很脆弱,只有在继承层次结构中引入新类之前才能工作。

另一种方法是在 IHttpRequest 接口中引入工厂方法:IHttpResposne CreateResponse()

这样,您将永远不必更改任何现有代码。任何新的实现都负责创建正确的 HTTP 响应实现。

【讨论】:

    【解决方案2】:

    Builder 和 Factory 都是“创造”模式。它们与“Builder”本质上用于配置和返回对象实例这一事实不同。

    Factory 可以从外部获取依赖项,或者直接在 Create() 方法中(如果所有实现都通用)并抽象出对类构造函数的调用。

    Builder 将返回一个 特定 类。工厂将返回一个接口,调用者不知道实现是什么

    【讨论】:

      猜你喜欢
      • 2010-12-03
      • 2010-09-09
      • 1970-01-01
      • 1970-01-01
      • 2011-01-05
      • 1970-01-01
      • 2013-09-22
      • 1970-01-01
      • 2014-01-14
      相关资源
      最近更新 更多