1
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);
4

3 回答 3

3

所以,总结一下。

该模式称为静态工厂方法,例如在此处进行了描述:如何使用“静态工厂方法”而不是构造函数?

在最简单的形式中,它看起来像这样:

 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);
    }

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

于 2012-06-16T17:54:59.237 回答
2

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

于 2012-06-16T17:22:51.810 回答
1

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

所以是的,它听起来类似于工厂方法模式,尽管它与你写的有些不同。工厂类应该不同于产品类。

于 2012-06-16T17:26:01.753 回答