实例工厂方法与静态工厂方法
2022-08-31 21:04:01
难道不是所有的工厂方法都是静态的吗?生产产品的东西需要状态吗?什么时候适合使用实例工厂或静态工厂方法?您能为我提供区分两者的例子吗?
难道不是所有的工厂方法都是静态的吗?生产产品的东西需要状态吗?什么时候适合使用实例工厂或静态工厂方法?您能为我提供区分两者的例子吗?
假设“实例工厂方法”实际上是在说GoF的“工厂方法”,那么Joshua Bloch在他的书“Effective Java”中描述了术语“静态工厂方法”。谷歌搜索我到达了这些网站:
希望它有助于使差异更清晰一些。
遵循马沃的建议:
定义用于创建对象的接口,但让子类决定要实例化的类。工厂方法允许类将实例化推迟到子类。
示例(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 代码):
public class Boolean {
...
public static Boolean valueOf(boolean b) {
return b ? Boolean.TRUE : Boolean.FALSE;
}
...
}
我目前的偏好是使工厂方法不是静态的,以便于测试。您无法在运行时更改静态工厂方法调用,而如果我可以为对象提供工厂实现,那么我可以更彻底地测试它,因为我可以更好地控制上下文和对象图。