使用静态工厂方法代替构造器的几大优势:
- 静态工厂方法具有名称。 可以通过它的名称来判断它返回的实例的大概信息。
- 不必再每次调用时都创建一个新的实例。 例如单例类就使用了静态工厂方法。
- 静态工厂方法可以返回原返回类型的任何子类型的对象实例。 如返回类型是Service,可以返回Service类型的任何子类型
- 在创建参数化类型的实例时,静态工厂方法使代码变得更加简洁。
静态工厂方法的一些惯用名称:
- valueOf 该方法返回的实例与它的参数具有相同的值。它实际上时做类型转化的。
- of valueOf的一种更为简洁的替代。
- getInstance 返回的实例通过方法参数来描述。对于单例类,该方法没有参数,并返回唯一的实例。
- newInstance 返回的实例通过方法参数来描述。每次返回的都是一个新的实例对象。
- getType Type指明返回的实例的类型。
- 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 }