优点:
①构造函数的方法名必须跟类名一样,调用方调用代码很难快速被读懂。使用工厂方法(跟设计模式的工厂方法不一样,本处指的是在目标类中直接加静态方法),则方法名就代表该方法要创建的对象的特征,调用端的调用的时候比较清楚自己要建造什么样的对象,不容易选错方法,而且代码也比较容易读懂。例如:
...
public static BigInteger probablePrime(int bitLength, Random rnd) {
......
}
...
②可以使用单例或有限多例,达到内存优化利用的目的。
例如:
...
public static Boolean valueOf(String s) {
return toBoolean(s) ? TRUE : FALSE;
}
...
③可以采用接口类的静态方法来返回要构建的对象以达到隐藏实现的目的,调用方不需要关心具体构建的是哪个实现类的对象。
④方法参数不同,返回的对象的类型也可以不同;在不同的发布版本中,静态方法返回的对象也可能有所不同。
⑤目标对象的实现类可以不存在,在真正运行时才明确,jdbc就是采用这种方式。
缺点:
①没有公共构造函数的类不能有子类。不过反过来思考,根据设计模式原则,一般鼓励用组合方式而不建议用继承方式。
②不像构造函数那样名字一定是跟类名一致,静态方法往往比较难被找到,需要编程人员肉眼一个一个方法找过去。该缺点可以通过规范化命名来尽量规避,例如get开头,intance开头、valueOf开头、create开头、new开头等等。