第一条:考虑使用静态工厂方法代替构造器

使用静态工厂方法代替构造器的几大优势:

  1. 静态工厂方法具有名称。 可以通过它的名称来判断它返回的实例的大概信息。
  2. 不必再每次调用时都创建一个新的实例。  例如单例类就使用了静态工厂方法。
  3. 静态工厂方法可以返回原返回类型的任何子类型的对象实例。   如返回类型是Service,可以返回Service类型的任何子类型
  4. 在创建参数化类型的实例时,静态工厂方法使代码变得更加简洁。

静态工厂方法的一些惯用名称:

  1. valueOf    该方法返回的实例与它的参数具有相同的值。它实际上时做类型转化的。
  2. of    valueOf的一种更为简洁的替代。
  3. getInstance   返回的实例通过方法参数来描述。对于单例类,该方法没有参数,并返回唯一的实例。
  4. newInstance     返回的实例通过方法参数来描述。每次返回的都是一个新的实例对象。
  5. getType      Type指明返回的实例的类型。   
  6. newType     Type指明返回的实例的类型。

利用静态工厂方法实现的服务提供者框架模式  :

服务接口  :

1 public interface Service {
2      /**
3       * n种服务
4       */
5     //.....
6 }

服务提供者接口:

1 public interface Provider {
2      /**
3       * 可以提供的n种服务
4       */
5      Service  newService();
6 }

具有服务提供者注册API和服务访问API的  服务类:

 1 public class Services {
 2     //私有化构造器   通过静态工厂方法来得到想要的Service实例
 3     private Services(){}
 4     //用来保存服务提供者对象的Map对象
 5     private static  final Map<String, Provider> providerMap = new HashMap<String, Provider>();
 6     //服务提供者对象的默认 key值
 7     private static  final String DEFAULT_NAME = "<def>";
 8     
 9     //提供静态工厂方法     将未提供key值得服务提供者对象 添加到Map对象中
10     public static void  registerProvider(Provider provider)
11     {
12         registerProvider(Services.DEFAULT_NAME, provider);
13     }
14     
15     //提供静态工厂方法     将提供key值的服务提供者对象 添加到Map对象中
16     public static void  registerProvider(String name , Provider provider)
17     {
18         providerMap.put(name, provider);
19     }
20     
21     //提供静态工厂方法   得到最终的服务对象
22     public static Service newInstance()
23     {
24         return newInstance(DEFAULT_NAME);
25     }
26     //提供静态工厂方法   得到最终的服务对象 
27     public static  Service newInstance(String name)
28     {
29         Provider p = providerMap.get(name);
30         
31         if(p == null)
32         {
33             throw new IllegalArgumentException("This provider not found");
34         }
35         
36         return p.newService();
37     }
38 }
原文地址:https://www.cnblogs.com/wangliyue/p/4422288.html