Effective Java 学习笔记 使用静态工厂方法代替构造器

来源:互联网 发布:手榴弹场地画法及数据 编辑:程序博客网 时间:2024/05/17 22:38

什么是使用静态工厂方法代替构造器:创建一个静态方法,返回值是类的实例

使用静态工厂方法的好处总结:

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.静态方法,如果放置不好的话,你不太容易发现它,毕竟它只是个普通的静态方法,虽然他可以做一些牛逼的事情。

0 0