对于类而言,为了让客户端获取自身的一个实例,最经常使用的就是提供一个共有的构造器。还有一种方法,也应该占有一席之地,它就是静态工厂方法。
spa
下面就介绍一下静态工厂方法与构造器的区别设计
优势:对象
1,静态工厂方法有名称,若是构造器的参数自己没有明确的描述正被返回的对象,那么具备适当名称的静态工厂会更容易使用。接口
2,静态工厂方法,没必要再每次调用的时候都建立一个新的对象。it
3,静态工厂方法,能够返回原返回类型的任何子类型的对象。(这种灵活的应用就是,API接口,API能够返回对象,同时又不会使对象的类变成公有的。)map
4,在建立参数化类型实例的时候,使代码变得更加简洁。方法
例如,Map<String, Map<String, String>> map=new HashMap<String, Map<String,String>>();经验
当参数类型变得愈来愈长,越复杂的时候,若是有静态工厂方法,能够明朗不少。客户端
public static <K,V> HashMap<K, V> newInstance(){static
return new HashMap<K, V>();
}
这样调用端是否是就很方便了,只要传具体的参数类型就能够了。
Map<String, Map<String, String>> map=HashMap.newInstance();
总之,有些规则不会百分之百适用于任什么时候刻和任何场合,可是它们确实体现了绝大多数状况下的最佳设计经验。你没必要盲目的听从这些规则,只有首先学会这些规则,而后才能知道何时能够打破这些规则。
缺点:
1,与其余的静态方法实际上没有任何的区别。
2,类若是不含公有的或者受保护的构造器,就不能被实例化。
简而言之,静态工厂方法和公有构造器各有用处,咱们须要理解它们各自的好处,静态工厂一般会更加合适,所以切忌第一反应就是提供公有的构造器,而不优先考虑静态工厂。