静态工厂方法(Static factory method)的优点:
1.静态工厂方法有名称
在需要多个构造函数且构造函数的参数类型完全一样时,可以使用静态工厂方法。而且可以选择静态工厂的名称以突出他们之间的区别
2.不必在每次调用他们的时候创建一个新的类
这使得使用静态工厂时,不会存在两个相等的实例,及当且仅当a==b是a.equals(b)为true
3.可以返回原返回类型的任意子类型
1 public interface RandomGenerator<T> { 2 T next(); 3 }
RandomIntGenerator 的第一个实现类如下:String类型的生成器如:01 class RandomIntGenerator implements RandomGenerator<Integer> { 02 private final int min; 03 private final int max; 04 05 RandomIntGenerator(int min, int max) { 06 this.min = min; 07 this.max = max; 08 } 09 10 public Integer next() {...} 11 }
1 class RandomStringGenerator implements RandomGenerator<String> { 2 private final String prefix; 3 4 RandomStringGenerator(String prefix) { 5 this.prefix = prefix; 6 } 7 8 public String next() {...} 9 }
01 public final class RandomGenerators { 02 // Suppresses default constructor, ensuring non-instantiability. 03 private RandomGenerators() {} 04 05 public static final RandomGenerator<Integer> getIntGenerator() { 06 return new RandomIntGenerator(Integer.MIN_VALUE, Integer.MAX_VALUE); 07 } 08 09 public static final RandomGenerator<String> getStringGenerator() { 10 return new RandomStringGenerator(''); 11 } 12 }
假设编写了一个新的获取随机数的类,那么只要让这个类实现RandomGenerators,然后在getIntGenerator方法中修改返回值就可以了
4.在创建参数化实例的时候,使代码更简洁
静态工厂方法的缺点:
1.类如果不含有public或者protected的构造方法,就不能被子类化
不理解
2.静态工厂方法与其他静态方法没有区别
在文档中没有那么容易认出静态工厂方法