考虑用静态工厂方法代替构造器

xiaoxiao2021-02-28  126

优势:

1 它们有名称

顾名思义,易于阅读。

2 不必在每次调用它们的时候都创建一个新对象

这使得不可变类可以使用预先构建好的实例,或者将构建好的实例缓存起来,进行重复利用,从而避免创建不必要的重复对象。

3 可以返回原返回类型的任何子类型的对象

这样我们在选择返回对象的类时就有了更大的灵活性。

4 在创建参数化类型实例的时候,它们使代码变得更加简介

Map<String,String> m = new HashMap<String,<String>(); 假设HashMap提供了这个静态工厂: public static <K,V> HashMap<K,V> newInstance(){ return new HashMap<K,V>(); } 就可以用下面这句简介的代码代替上面这段繁琐的声音: Map<String,String> m = HashMap.newInstance();

缺点

1 类如果不含共有的或者受保护的构造器,就不能被子类化。

2 它们与其它的静态方法实际上没有任何区别。

遵守标准命名习惯,可以弥补这一劣势。

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

valueof

不太严格得讲,该方法返回的实例与它的参数具有相同的值。这样的静态工厂方法实际上是类型转换方法。

of

valueOf的一种更为简洁的替代。

getInstance

返回的实例是通过方法的参数来描述的,但是不能能够说与参数具有相同的值。对于Singleton来说,该方法没有参数,并返回唯一的实例。

newInstance

像getInstance一样,但newInstance能够确保返回的每个实例都与所有其他实例不同。

getType

像getInstance一样,但是在工厂方法处于不同的类中的时候使用,Type表示工厂方法所返回的对象类型。

newType

像newInstance一样,但是在工厂方法处于不同的类中的时候使用,Type表示工厂方法所返回的对象类型。

转载请注明原文地址: https://www.6miu.com/read-27242.html

最新回复(0)