【问题标题】:Is there a design pattern for this kind of construction code?这种构造代码有设计模式吗?
【发布时间】:2012-06-16 17:21:20
【问题描述】:
public class A {
    private A(int param1, String param2) {}

    public static A createFromCursor(Cursor c) {
        // calculate param1 and param2 from cursor
        return new A(param1, param2);
    }
}

这种构造代码有设计模式吗?如果是这样,这种模式的目的是什么?为什么不直接使用:

// calculate param1 and param2 from cursor
new A(param1, param2);

【问题讨论】:

  • 由于这不是有效的 Java,因此将其视为一种设计模式似乎没有实际意义。
  • @Dancrumb 这里有什么无效的?
  • @dantuch:它已被编辑。现在是正确的
  • 在工厂创建的苏联 Java 工厂中。

标签: java design-patterns


【解决方案1】:

所以,总结一下。

该模式称为静态工厂方法,例如在此处进行了描述:How to use "Static factory methods" instead of constructors?

最简单的形式如下:

 class A {

     public static A newA() {
        return new A();
     }
     private A(){}
 }

您的示例稍微复杂一些,因为它包含用于调用构造函数的计算参数

public class A {
    private A(int param1, String param2) {}

    public static A createFromCursor(Cursor c) {
        // calculate param1 and param2 from cursor
        return new A(param1, param2);
    }
}

使用这种方式创建新对象的目的可能是每次直接调用new A(params)之前都需要重复计算。所以这只是避免重复自己,实现这一点的最简单方法是创建一个方法。

此外,使用相同的方式,您可以提供更多选项来创建new A。例如,您可以更改计算的方式:

    public static A createFromCursorDifferently(Cursor c) {
        // calculate param1 and param2 from cursor in different way
        return new A(param1, param2);
    }

那么你可以将相同的参数传递给这个方法,结果会不同(因为方法名称不同)。

当然,您可以使用与以前相同的构造函数从任何其他参数创建您的new A

    public static A createFromObject(Object o) {
        // calculate param1 and param2 from object
        return new A(param1, param2);
    }

因此,与仅使用构造函数相比,静态工厂方法拥有更多可能性。

【讨论】:

  • @Johnny,很高兴听到这个消息;)
  • 我认为您错过了这种模式的两个常见用途。一个是静态方法可以选择实例化哪个类——它可以做类似if (conditionA) return new A(...) else return new B(...) 的事情。另一种方法是允许调用者实例化一个类的构造函数,无论出于何种原因,您都不想公开公开(例如,因为您想限制谁可以创建它的子类)。 ByteBuffer 就是一个很好的例子。
  • @yshavit 你是对的,但我试图坚持给定的问题,而不是描述这种模式的整体性质,并作为一般因素考虑:)
【解决方案2】:

如果您的代码已编译,它将表示一个简单的factory method(它返回一个静态的什么?当然是一个 A)。有些人认为这是一种模式,但其他人则认为它非常简单。有一个名为 Abstract Factory Pattern 的模式使用了这个概念,但使用的方式要复杂得多。

【讨论】:

    【解决方案3】:

    如果更正,您发布的内容的目的应该是提供一种方法来返回 extends A 的实例,而无需先验地知道运行时类型。

    所以是的,它听起来类似于Factory method pattern,尽管它与您写的有些不同。 factory 类应该不同于 product 类。

    【讨论】:

    • The factory class should be different from the product class. 是的,这就是为什么作为示例提供的代码是 静态工厂方法 的示例,正​​如@Tomasz Nurkiewicz 所指出的那样。并且该静态方法应该放在它正在分解的同一个类中,只是为了替换显式构造函数。 《Effective Java》中有很好的描述——Java程序员最推荐的书籍之一
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多