使用静态工厂方法的动机

时间:2012-11-22 15:10:09

标签: java

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

  

Replace Constructor with Factory的最明显动机   方法来自用子类替换类型代码。

     

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

     

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

任何人都可以用代码解释一下吗?这个类型代码是什么意思?

3 个答案:

答案 0 :(得分:2)

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

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


  

这种类型代码意味着什么?

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

答案 1 :(得分:1)

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

e.g。这两个方法返回一个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);
}

你可以看到它有一个实现较小的枚举集,另一个实现较大的枚举集。

答案 2 :(得分:1)

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

现在假设我们用对象层次结构替换此类型字段:Person具有2个子类TeacherStudent的类。

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

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

public static Person newPerson() {
   // can return either a Teacher or a Student
}