【问题标题】:Factory Method Design Pattern `static` modifier must need or not工厂方法设计模式`static`修饰符必须需要或不需要
【发布时间】:2016-05-08 17:30:51
【问题描述】:

我正在研究设计模式。我在java中研究了Factory Design Pattern,我有一些我不太了解的东西,我正在写它们。

  1. Factory 设计模式和Factory Method 设计模式之间有什么不同吗?
  2. 我在一些examples 中看到,工厂类的get 方法是static,而有些examples 不是static。正确的方法是什么。

任何帮助将不胜感激。

【问题讨论】:

  • 对我来说这个解释是最好的:stackoverflow.com/questions/13029261/…
  • 工厂是一个用于创建对象的类,它可能有一个或多个工厂方法,但工厂方法并不是工厂类独有的。将工厂方法放在不是工厂的对象上的主要原因是因为该对象具有一些可以简化创建过程的知识。例如,twoMinutes = oneMinute.plusMinutes(1);

标签: java oop design-patterns


【解决方案1】:

我对设计模式并不太深入,因为我没有阅读大量抽象地讨论它们的书籍,但我当然知道它们是什么并且知道如何应用它们。以下是我对这两种模式的理解:

  • Factory 是一种模式,它通过处理知道如何构造其他对象的对象来延迟对象的实例化。这有几个优点。例如,假设您正在编写一个主题池库。池包含可以执行某些操作的对象,并且您希望能够创建任何大小的池。池中的每个对象都必须是不同的对象。您可以要求池的用户在池中为您提供他们想要的任意数量的对象,但您也可以要求他们提供一个您将用于自己实例化对象的工厂。通过这种方式,您还可以动态更改池的大小、销毁或重新生成对象等......它提供了您所需的所有灵活性,而无需了解您的池所持有的对象。

  • Factory method 不同。假设您有一个带有很多参数的大型构造函数。其中一些参数可能具有默认值,或者您可能有多种方式来配置此类。您当然可以为每个典型配置(参数集)添加一个构造函数,但这对用户不友好,因为所有构造函数都共享相同的名称。为了使它更容易,您可以使用静态方法来调用具有适当配置的构造函数。优点是您可以命名这些方法(defaultHttpClientForProddefaultHttpClientForDev 等...)。另一个用例是,如果你有一个庞大的类层次结构,比如一个由几十个类扩展的抽象类Car。您可以使用每个单独的构造函数来构建您的梦想汽车,但您必须查看目录的每一页来决定您想要哪一个。您也可以有一个页面来总结所有可用的汽车,这将是一个包含许多工厂方法的类,使它们更容易被发现。

关于你的第二个问题,我想说这取决于。如果您不需要过多地自定义您的工厂或注入大量上下文,那么带有一些参数的静态方法就可以解决问题。如果您希望您的工厂更具可配置性,那么具有属性和实例方法的类会更好。

【讨论】:

    【解决方案2】:

    具体到您的问题:

    1. 抽象工厂和工厂方法是两种不同的设计模式。详细说明请参阅四人组(设计模式)。主要区别在于 Abstract Factory 或 Factory 是关于创建相关对象的族(注意词族表示对象组),而 Factory 方法 em> 提供了一种创建方法来创建一种特定类型的对象(不是系列),可以由多个工厂实现类实现。本质上,工厂方法用于实现工厂或抽象工厂模式,反之则不行。
    2. static 方法而言,它不是由模式本身规定的。它特定于 Java,因此静态修饰符用于确保 Factory 的 getInstance() 或任何创建方法是 Singleton。您不想要多个 Factory 实例,因此在 Java 中,您可以通过 static Factory 实例来实现,因此,您将需要 static 方法来返回 static 实例。

    【讨论】:

      【解决方案3】:

      通过工厂设计模式,不同的教程似乎意味着不同的东西。我会说您链接中的那些都是简单的工厂。我认为这篇文章简单地解释了差异:Simple Factory vs. Factory Method vs. Abstract Factory

      可以通过使用静态方法创建不同的子类来识别简单工厂,通常使用某种 if/else 或 switch 结构。第二个链接中的示例实际上并没有使用静态方法,但可以轻松地将其设为静态,而无需进行太多更改。

      在《四人帮》一书中,工厂方法模式被定义为:

      定义创建对象的接口,但让子类决定 要实例化哪个类。 Factory 方法允许类延迟 它用于子类的实例化。

      由于使用了子类,静态方法在这里不起作用,因为它们不能被覆盖。以这种方式完成的形状示例更像:

      public interface ShapeFactory {
          Shape getShape();
      }
      
      public class CircleFactory implements ShapeFactory {
          public Shape getShape() {
              return new Circle();
          }
      }
      
      public class RectangleFactory implements ShapeFactory {
          public Shape getShape() {
              return new Rectangle();
          }
      }
      
      ShapeFactory shapeFactory = new CircleFactory();
      ...
      Shape shape = shapeFactory.getShape();
      

      在这里,我们可以将工厂的创建与使用分开。工厂可以在一个类中创建,然后传递给另一个类,因此一个类可以通过另一个类的配置来创建不同类型的对象。

      或者在 Java 8 中,我们可以使用:

      Supplier<Shape> shapeFactory = Circle::new;
      ...
      Shape shape = shapeFactory.get();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多