建立类的实例最多见的是new 除此外还可使用静态工厂方法,来封装实例的细节,而且能控制实例的数量,减轻jvm的堆栈中的压力。静态工厂方法最主要的特色是:每次被调用的时候,不必定要建立一个新的对象。java
静态工厂方法:静态工厂方法与别的静态方法没有什么区别,只不过该方法产生的类对象,不作其余事情。缓存
静态工厂方法与构造器不一样的优点在于:jvm
静态工厂方法有名称函数
静态工厂方法能够突破构造函数不能自由命名的限制,对于不一样的工厂方法能够采用不一样的会意的名字,是程序具备更好的可读性。spa
没必要在每次调用的时候都建立一个新对象code
每次执行new语句时,都会建立一个新的对象。而静态工厂方法每次被调用的时候,是否会建立一个新的对象彻底取决于方法的实现。
orm
静态工厂方法能够返回原返回类型的任何子类型的对象对象
new语句只能建立当前类的实例,而静态工厂方法能够返回当前类的子类的实例,这一特性能够在建立松耦合的系统接口时发挥做用。接口
静态工厂方法是用来产生对象用的,至于产生什么类型的对象没有限制,这就意味这只要返回原返回类型或原返回类型的子类型均可以。这样就能够更好达到封装的目的,下降API的数目和用户的使用难度。
get
在建立参数化类型实例的时候,使代码变得更加简洁
例如,在调用参数化类的构造器时,即便类型参数很明显,也必须指明:
Map<String, List<String>> m = new HashMap<String, List<String>>();
随着参数类型的愈来愈长、复杂,这一冗长的构造器参数说明也变得痛苦起来。可是有了静态构造方法,编译器就能够替你找到类型参数,这被称做类型推导(type inference)。例如:假设HashMap提供了如下静态工厂:
public static <K,V> HashMap<K,V> newInstance() { return new HashMap<K,V>(); }
有了这个静态工厂方法,就能够用如下代码代替上述复杂繁琐的声明:
Map<String, List<String>> m = HashMap.newInstance();
利用特色3,静态工厂方法可用来建立如下类的实例。
单例类:只有唯一的实例的类。
枚举类:实例的数量有限的类。
具备实例缓存的类:能把已经建立的实例暂且存放在缓存中的类。
具备实例缓存的不可变类:不可变类的实例一旦建立,其属性值就不会被改变。
静态工厂方法的缺点:
类若是不含有公有的或受保护的构造器,就不能被子类化
准确理解:若是父类没有提供Public的或者Protected的构造方法,那么使用静态工厂方法,将没法根据父类去获取到子类的实例。
静态工厂方法与其余的静态方法实际上没有任何区别
比较流行的规范是把静态工厂方法命名为valueOf或者getInstance。