0

使用静态工厂方法的动机如下:

Replace Constructor with Factory Method 最明显的动机是用子类化替换类型代码。

您有一个经常使用类型代码创建的对象,但现在需要子类。确切的子类基于类型代码。

但是,构造函数只能返回被请求的对象的一个​​实例。所以你需要用工厂方法替换构造函数。

谁能用代码解释一下?这个类型代码是什么意思?

4

3 回答 3

2

工厂方法相对于裸构造函数的第二个优势是它可以返回现有对象。该Integer.valueOf(int)方法很好地利用了这一点。相比之下,new总是创建一个新对象。

最后,如果我们稍微扩大讨论范围,非静态工厂方法(例如以工厂对象的形式)允许您使用多态性来实现不同的对象创建策略。


这个类型代码是什么意思?

您需要在获得此内容的页面的上下文中阅读此内容。该页面所讨论的是代表不同“类型”事物的单个类。(在给出的例子中,一个Employee类代表不同类型的员工。)“类型代码”只是区分不同类型的类的属性。

于 2012-11-22T15:15:56.653 回答
1

构造函数只能返回一个实现,但是静态工厂方法可以返回任意数量的实现,通常是所引用类的子类。静态工厂方法还具有命名的优点,因此您可以对相同的参数有不同的行为。

例如,这两个方法返回一个 EnumSet 的子类(基于枚举中元素的数量),根据名称(即使论点相同)具有不同的值

EnumSet<MemoryType> memoryTypes = EnumSet.noneOf(MemoryType.class);
EnumSet<MemoryType> memoryTypes2 = EnumSet.allOf(MemoryType.class);

从源头

public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {
    Enum[] universe = getUniverse(elementType);
    if (universe == null)
        throw new ClassCastException(elementType + " not an enum");

    if (universe.length <= 64)
        return new RegularEnumSet<>(elementType, universe);
    else
        return new JumboEnumSet<>(elementType, universe);
}

您可以看到它有一种用于较小枚举集的实现,另一种用于较大的枚举集。

于 2012-11-22T15:13:36.277 回答
1

想象一下,我们有一个Person类,其中有一个字段type,用于指示该人是教师还是学生。这将是类型代码。

现在想象我们用对象层次结构替换这个类型字段:Person具有 2 个子类的类TeacherStudent.

如果我使用构造函数,那么我只能创建特定类型的人,即new Teacher()new Student()

但是如果我想要一种基于某种逻辑创建不同类型的人的方法,那么我可以这样做:

public static Person newPerson() {
   // can return either a Teacher or a Student
}
于 2012-11-22T15:17:42.007 回答