Effective Java 学习笔记《一》 静态工厂方法
2016-10-27 23:02
288 查看
Effective Java 学习笔记《一》 静态工厂方法
感觉之前从来没有听说过静态工厂方法,书上夸它各种好,不明觉厉,就找了些资料学习一下。参考了书和http://www.xuebuyuan.com/1913991.html
静态工厂方法是做什么的
利用new语句调用类的构造方法可以实例化一个对象,但是每new一次都会占用java虚拟机中堆的内存。静态工厂方法是实例化的另一种方式,有自己的一些优点。那么它有什么优点
书上说它有下面几个优点有名称
构造方法的名字必须与类名相同。静态工厂方法的方法名可以是任意的,这一特性的优点是可以提高程序代码的可读性。
不必每次调用都创建新对象
静态工厂方法能够为重复的调用返回相同的对象,这样有助于泪纵能严格控制在某个时刻什么实力应该存在。即:实力受控的类。
new语句只能创建当前类的实例,而静态工厂方法可以返回当前类的子类的实例
这点书上讲的我还不太明白,看明白后了再做修改
创建参数化实例时使代码更为简洁
这一点最好理解,举个例子:
Map<String,List<String>> m = new HashMap<String,List<String>> //这句初始化会随着结构的复杂变得越来越复杂 //使用静态工厂可以替代 //假设HashMap提供了这个静态工厂: public static <K,V> HashMap<K,V> newInstance(){ return new HashMap<K,V>(); } //声明代码就可以简化成 Map<String,List<String>> m = HashMap.newInstance();
利用每次调用时不一定会创建新对象这个特点
这个特点是静态工厂方法最重要的特点。可以应用在创建如下几种实例的情况中:单例类
Struts框架的ActionServlet类就是单例类,此外,Hibernate的SessionFactory和Configuration类也是单例类。
实现单例类有两种方式:
(1)把构造方法定义为private类型,提供public static final类型的静态变量,该变量引用类的惟一的实例,例如:
public class GlobalConfig { public static final GlobalConfig INSTANCE = new GlobalConfig(); private GlobalConfig() {…} … }
这种方式的优点是实现起来比较简洁,而且类的成员声明清楚的表明该类是单例类。
(2)把构造方法定义为private类型,提供public static类型的静态工厂方法,例如:
public class GlobalConfig { private static final GlobalConfig INSTANCE =new GlobalConfig(); private GlobalConfig() {…} public static GlobalConfig getInstance(){return INSTANCE;} … }
这种方式的优点是可以更灵活的决定如何创建类的实例,在不改变GlobalConfig类的接口的前提下,可以修改静态工厂方法getInstance()的实现方式,比如把单例类改为针对每个线程分配一个实例。
枚举类
枚举类是指实例的数目有限的类,比如表示性别的Gender类,它只有两个实例:Gender.FEMALE和Gender.MALE
在创建枚举类时,可以考虑采用以下设计模式:
(1)把构造方法定义为private类型。
(2)提供一些public static final类型的静态变量,每个静态变量引用类的一个实例。
(3) 如果需要的话,提供静态工厂方法,允许用户根据特定参数获得与之匹配的实例。
不可变类与可变类
具有实例缓存的不可变类
松耦合的系统接口
以上几类详情参见http://www.xuebuyuan.com/1913991.html
缺点
类如果不含共有的或者受保护的构造器就不能被子类化比如,不可以将Collections Framework中的任何方便的实现类子类化。因为它鼓励程序员使用复合而不是继承。(日后需要回过来看)
他们与其他的静态方法实际上没有区别
很难在api文档中查明如何实例化一个用静态工厂方法构造的类。
下面是一些惯用名:
(1)valueOf/of 类型转换方法,返回的实力与她的参数具有相同的值。
(2)getInstance 返回的实例是通过方法的参数来描述的。
(3)newInstance 和上面那个一样,但它能确保返回的每个实例都与其他实例不同。
(4)getType 和getInstance一样,但在工厂方法处于不同的类中的时候使用。Type表示工厂方法返回的对象类型。
(5)newType 和newInstance一样,类似于getType。
相关文章推荐
- Effective Java 学习笔记 使用静态工厂方法代替构造器
- 【Effective Java笔记】第1条:考虑用静态工厂方法代替构造器
- EffectiveJava-考虑用静态工厂方法代替构造器
- Effective Java —— 考虑用静态工厂方法代替构造器
- Effective Java 1:考虑使用静态工厂方法代替构造器
- Effective Java 中文版之学习 第1条:考虑用静态工厂方法代替构造器
- EffectiveJava-1.考虑使用静态工厂方法替代构造方法
- Effective Java: 使用静态工厂方法
- Effective Java第一条:考虑用静态工厂方法替代构造器
- Effective Java 3rd 条目1 考虑用静态工厂方法代替构造子
- Effective Java -- 用静态工厂方法来代替构造器
- Effective Java 进阶之路第一章(创建和销毁对象) 第一条(静态工厂方法)
- [Effective Java Distilled] Item 1 考虑使用静态工厂方法来替换构造方法
- Effective Java --静态工厂方法
- Effective Java Item1:优先考虑使用静态工厂方法
- Effective.Java 读书笔记(1)静态工厂和构造方法
- 学习effective java-1创建和销毁对象之静态工厂方法
- [Effective Java Distilled] Item 1 考虑使用静态工厂方法来替换构造方法
- Effective java第一条:考虑用静态工厂方法代替构造器
- 改善JAVA代码01:考虑静态工厂方法代替构造器