考虑用静态工厂方法代替构造函数
静态工厂方法只是一个简单的静态方法,它返回的是类的一个实例
三个优点
- 静态工厂方法与构造函数不同,静态工厂方法具有名字。
如果一个构造函数的参数并没有确切的描述被返回的对象,那么选用适当名字的静态工厂可以使用一个类更易于使用,并且相应的客户代码更易于阅读。
- 它们每次被调用的时候,不要求非得创建一个新得对象。
1.这使得一些非可变类可以使用一个预先构造好的实例,或者把已经构造好的实例缓存起来,以后再把这些实例飞发给客户,从而避免创建不必要的重复对象。
2.静态工厂方法可以重复的调用返回同一个对象,这可以被用来控制"在某一时刻哪些实例应该存在".
- 它们可以返回一个原返回类型的子类型的对象
两个缺点
- 类如果不含有公有的或者受保护的构造函数,就不能被子类化。
- 它们与其它静态方法没有任何区别
使用私有构造函数强化singleton属性
singleton类是指这样的类,他只能实例化一次。singleton通常被用来代表那些本质上具有唯一性的系统组件,比如视频显示或者文件系统。
- 实现singleton有两种方法。这俩种方法都要把构造函数保持为私有的,并且提供一个静态成员,以便允许客户能够访问该类的唯一实例。
//Singleton with final field
public class Elvis{
pulic static final Elvis INSTANCE =new Elvis();
private Elvis(){
···
}
···//Remainder omitted剩余部分省略
}
私有构造函数仅被调用一次,用来被实例化公有的final域Elvis.INSTANCE。由于缺少公有的或者受保护的构造函数,所以保证了Elvis的全局唯一性:一旦Elvis类被实例化之后,只有一个Elis实例存在——不多也不少。
- 提供一个公有的静态工厂方法,而不是公有的静态final域
public class Elvis{
private static final Elvis INSTANCE =new Elvis();
private Elvis(){
···
}
public static Elvis getInstance(){
return INSTANCE;
}
...//Remainder omitted
}
所有对于静态方法Elvis.getInstance的调用,都会返回同一个对象引用,所以,不会有别的Elvis实例被创建。
网友评论