实例工厂方法与静态工厂方法

2022-08-31 21:04:01

难道不是所有的工厂方法都是静态的吗?生产产品的东西需要状态吗?什么时候适合使用实例工厂或静态工厂方法?您能为我提供区分两者的例子吗?


答案 1

假设“实例工厂方法”实际上是在说GoF的“工厂方法”,那么Joshua Bloch在他的书“Effective Java”中描述了术语“静态工厂方法”。谷歌搜索我到达了这些网站:

希望它有助于使差异更清晰一些。

遵循马沃的建议:

  • 工厂方法如 GoF 中所述:

    定义用于创建对象的接口,但让子类决定要实例化的类。工厂方法允许类将实例化推迟到子类。

示例(Java 代码):

    public abstract class Product { ... }

    public class ConcreteProduct extends Product { ... }

    public abstract class Creator {
      public void anOperation() { ... product = factoryMethod(); ... }
      public abstract Product factoryMethod();
    }

    public class ConcreteCreator extends Creator {
      public Product factoryMethod() { return new ConcreteProduct(); }
    }
  • 有效 Java 中所述的静态工厂方法:

    类可以提供公共静态工厂方法,该方法只是返回类的实例的静态方法。静态工厂方法的一个优点是,与构造函数不同,它们具有名称。(...)静态工厂方法的第二个优点是,与构造函数不同,它们不需要在每次调用时都创建新对象。(...)静态工厂方法的第三个优点是,与构造函数不同,它们可以返回其返回类型的任何子类型的对象。(...)仅提供静态工厂方法的主要缺点是,没有公共或受保护构造函数的类不能被子类化。

示例(Java 代码):

    public class Boolean {
      ...
      public static Boolean valueOf(boolean b) {
        return b ? Boolean.TRUE : Boolean.FALSE;
      }
      ...
    }

答案 2

我目前的偏好是使工厂方法不是静态的,以便于测试。您无法在运行时更改静态工厂方法调用,而如果我可以为对象提供工厂实现,那么我可以更彻底地测试它,因为我可以更好地控制上下文和对象图。


推荐