静态工厂对比构造器之优缺点
静态方法介绍
对于一个类,拿到它自身的一个实例,我们通常是调用公有的构造器,但是还有一种方法-静态工厂方法,在某些情况下可以更加方便返回类的实例。
静态工厂-返回类的一个实例的静态方法。
静态方法应用举例
在Boolean这个类中,有个valueOf方法,我们来看看它的源代码:
public static Boolean valueOf(boolean b) { return (b ? TRUE : FALSE); }
查看一个TRUE和FALSE在Boolean中的定义
public static final Boolean TRUE = new Boolean(true); public static final Boolean FALSE = new Boolean(false);
我们从上面可以看出:
- valueOf方法是static的,是静态的
- valuof方法返回的是Boolean的一个已经实例化好的实例,而且这个实例是可以重复利用的
优势
优点一:构造器方法名写死,静态工厂方法可以改名称,让人顾名思义
类的构造方法是写死的,例如类User的构造方法名只能为User,如果是使用静态工厂方法,名称为createUser,这样人家一看就知道这样方法是干什么用的了。
优点二:静态工厂方法可以做到每次调用的时候都不必创建一个对象
在静态方法中,我们可以预先创建一个对象,每次返回一个该对象,就不用创建了,前提是调用者使用同一个对象不会出现问题
/** * User类 * @author xujianguo * */ public class User { /** * 创建静态不可变的对象 */ private static final User user = new User(); /** * 静态工厂方法 * 返回唯一的实例 * @return */ public static User newInstance() { return user; } }
优点三:静态工厂方法可以返回原返回类型的任何子类的对象
构造方法只能返回该类的对象,而静态工厂方法可以利用多态,返回该类的子类的对象。
/** * Father类 * @author xujianguo */ class Father { /** * 构造方法 */ public Father() {} /** * say方法 */ public void say() { System.out.println("Father say"); } /** * 静态工厂方法 * 根据index来返回对象,可以返回该类的子类的对象 * @param index * @return */ public static Father newInstance(int index) { switch(index) { case 1: return new Son1(); case 2: return new Son2(); default: return new Father(); } } } /** * Son1类 * 继承Father * @author xujianguo */ class Son1 extends Father { public void say() { System.out.println("Son1 say"); } } /** * Son2类 * 继承Father * @author */ class Son2 extends Father { public void say() { System.out.println("Son2 say"); } }
缺点
缺点一:静态工厂方法与其他静态方法没有什么区别
静态工厂方法的作用是跟构造方法一样的,但是却在定义上跟其他静态方法没有区别,这样开发者很难在一堆静态方法中找到静态工厂方法来创建对象。
缺点二:若类没有提供公有的构造方法,就不能自己写静态方法去创建对象
posted on 2015-05-04 23:14 进击的Ray_xujianguo 阅读(924) 评论(0) 编辑 收藏 举报