Kevin Brock..
7
他们可能正在讨论静态工厂方法模式(而不是用于动态创建对象的反射API方法).
有一些方法的优点,例如getInstanceOf()构造函数和使用方法new.静态工厂方法可以......
如果在某些情况下需要(基于环境条件,例如属性和其他对象/单例或方法参数),则选择创建主类的不同子类.
选择返回现有对象而不是创建对象.有关此示例,请参阅Java API中的Boolean.valueOf(boolean).
做与构造函数相同的事情 - 只返回类本身的新实例.
提供许多不同类型的方法来构造一个新对象并命名这些方法,以便它们不那么混乱(例如,尝试使用构造函数,很快就会有许多不同的重载).有时,如果您需要能够以两种不同的方式创建实例但只需要相同类型的参数,那么构建器甚至无法实现这一点.例:
// This class will not compile!
public class MyClass {
public MyClass(String name, int max) {
//init here
}
public MyClass(String name, int age) {
// init here
}
}
// This class will compile.
public class MyClass2 {
private MyClass2() {
}
public static MyClass2 getInstanceOfMax(String name, int max) {
MyClass2 m2 = new MyClass2();
// init here
return m2;
}
public static MyClass2 getInstanceOfAge(String name, int age) {
MyClass2 m2 = new MyClass2();
// init here
return m2;
}
}
做上述任何组合.
并且,最重要的是它隐藏了从其他类实例化实例的细节,因此将来可以改变(构造封装).
构造函数只能创建所请求的确切类型的对象的新实例.以后不能改变.
这种模式的一些缺点是:
工厂方法是静态的,因此不能在子类中继承; 子类很容易访问父构造函数.
工厂方法名称可能有很大差异,这可能会让一些(新)开发人员感到困惑.
你还要求个人经历.是的,我经常使用这两种模式.对于大多数类构造函数,但是当有更多高级需求时,我使用静态工厂.我还从事其他语言的项目(专有,但类似于Java),这种形式的构造是强制性的.