01、考虑用静态工厂方法代替构造器

来源:互联网 发布:数据与信息的关系是 编辑:程序博客网 时间:2024/06/05 15:43

优点

1. 有名称,当一个类需要多个带有相同参数的构造器时,就可以用静态工厂方法代替构造器,并且慎重地选择名称以便突出它们之间的区别

例如下边的有关汽车的类,可以使用三个静态工厂方法返回不同的汽车

public class Car {private String name;private Car(String name) {this.name = name;}public static Car getFord() {return new Car("Ford");}public static Car getVolkswagen() {return new Car("Volkswagen");}public static Car getLamborghini() {return new Car("Lamborghini");}public String getName() {return this.name;}}

2. 不必在每次调用它们的时候都创建一个新对象

单例

确保不可实例化

确保不会存在两个相等的实例,当且仅当a==b的时候才有a.equals(b)为true,这样可以用==代替equals方法,提高性能。例如枚举类型

3. 可以返回原返回类型的任何子类型的对象

下边的例子,利用父类的静态工厂方法返回三个不同的子类

public class Car2 {public static Car2 newFord() {return new Ford();}public static Car2 newVolkswagen() {return new Volkswagen();}public static Car2 newLamborghini() {return new Lamborghini();}}class Ford extends Car2 {public Ford() {System.out.println("Ford");}}class Volkswagen extends Car2 {public Volkswagen() {System.out.println("Volkswagen");}}class Lamborghini extends Car2 {public Lamborghini() {System.out.println("Lamborghini");}}
4. 在创建参数化类型实例的时候,它们使代码变得更加简洁

缺点

1. 类如果不含有公有的或者受保护的构造器,就不能被子类化

2. 与其他的静态方法实际上没有任何区别。方法名称可以各式各样,实例化的时候有可能会很迷惑

静态工厂方法的惯用名称

1. valueOf

2. of

3. getInstance

4. newInstance

5. getType

6. newType