什么是使用静态工厂方法代替构造器:创建一个静态方法,返回值是类的实例
使用静态工厂方法的好处总结:
1.可以隐藏构造方法,把控对象的创建。可以让对象是单例,复用已经有的对象,比如Boolean
public static final Boolean TRUE = new Boolean(true);
public static final Boolean FALSE= new Boolean(false);
public static Boolean valueOf(boolean b){ return ( b ? TRUE:FALSE) }
Android 开发中使用SharePrefrences可以继承它,然后创建一个静态工厂方法用于创建SharePrefrences的实例,然后每次调用的时候都返回这个实例,实现整个程序在 运行期间只会创建一个实例。
思考:在什么时候会不用构造方法,而是直接使用静态工厂方法。1.对于全局只需要具体数量实例的类可以添加静态工厂方法。
2.静态构造方法的命名比构造方法的命名更加直接醒目,方便调用者去调用适合自己的构造方法。还解决了参数类型列表相同只能有唯一构造方法的限制
思考:什么时候使用静态工厂方法, 初始化参数类型比较复杂,或者说有很多相同类型但是含义不同的参数。可以尝试使用静态工厂方法。这样容易区分和初始化数据。
从名字上就能区分所有的构造方式岂不是更加happy
3.静态构造方法可以返回原返回类型的任何子类型对象。
思考?什么时候会想起来用这个?比如说,有一个排序类,它有几个子排序类继承于它。当我们想通过不同的排序类进行排序的时候,可以通过调用父类的静态构造方 法,这样就可以隐藏子类排序方法的具体实现,同时也隐藏了这个子类。这样方法调用者在使用排序类的时候的方法是很简单的。完全和排序实现解耦。如果不这样做, 客户端要去了解这个基类的所有子类,然后再取筛选用哪个。通过这个方式,客户端开发人员对于咋实现的,完全懵逼。
还有一个比较大的好处,就是向客户端提供API的接口就可能会大规模减少,毕竟没有具体子类的接口了嘛。
4.静态构造方法,它还简化参数类型的声明,这个的效果就是看起来简单点。
有缺点:
1.没有公开或者是受保护的(public || protected)的构造方法,不能子类化。(子类都没法构造了嘛,你就只能使用这个类了。)
2.静态方法,如果放置不好的话,你不太容易发现它,毕竟它只是个普通的静态方法,虽然他可以做一些牛逼的事情。