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