静态工厂对比构造器之优缺点

静态方法介绍

  对于一个类,拿到它自身的一个实例,我们通常是调用公有的构造器,但是还有一种方法-静态工厂方法,在某些情况下可以更加方便返回类的实例。

  静态工厂-返回类的一个实例的静态方法。

静态方法应用举例

  在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);

  我们从上面可以看出:

  1. valueOf方法是static的,是静态的
  2. 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编辑  收藏  举报

导航