考虑用静态方法替代构造器

优点:

1.他们有名称。使用具有适当名称的静态方法返回对象,代码更易于阅读

    new BigInteger(int,int,Random)->BigInteger.probablePrime(int,int,Random)
    表明返回的BigInteger可能为素数

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

    这使得不可变类使用预先构建好的实例,或者将构建好的实例缓存起来,重复利用,避免创建不必要的重复对象

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

 public interface Provider {
      Service newService();
 }
   
 public class Services {

      // 不可实例化
      private Services() {
      }

      private static final Map<String, Provider> providers  = new ConcurrentHashMap<String, Provider>();
      private static final String                DEFAULT_PROVIDER_NAME = "<def>";

      public static void registerDefaultProvider(Provider p) {
          registerDefaultProvider(DEFAULT_PROVIDER_NAME, p);
      }

      public static void registerDefaultProvider(String name, Provider p) {
          providers.put(name, p);
      }

      public static Service newInstance() {
          return newInstance(DEFAULT_PROVIDER_NAME);
      }

      public static Service newInstance(String name) {
          Provider p = providers.get(name);
          if (p == null) {
              throw new IllegalArgumentException(
                      "No providers registered with name : " + name);
          }
          return p.newService();
      }
 }

4.创建参数化实例时,使代码更加简洁

缺点:

1.不含有public或者protected的构造器,就不能被子类化。

    举个例子,使用cglib动态代理该类时应该就会报错
    但是同样的鼓励我们“多用组合,少用继承”

2.与其他的静态方法实际上没有任何区别

    查询javadoc的时候,如何实例化该类变得非常困难

###静态方法初始化类和构造器都有各自的用处,我们需要理解他们各自的长处,因地制宜。