Effective 学习(1) ---- 静态工厂方法

2.优点的体现

Effective Java中共提到好处四点:

1、它们有名称

2、它们可以返回原返回类型任意子类型的对象。

针对于第一点,相比较于与类名相同的构造函数,静态工厂方法是通过静态方法进行对象的初始化,其方法名字自然可以自定义,从而帮助开发人员的理解,这是容易理解的。例如:构造器BigInteger(int,int,Random)返回的BigInteger可能为素数,如果改名为 BigInteger.probablePrime的静态方法表示,显然更为清楚。

对于第二点没看明白,摘自网络:

第二点,其在Java中的集合类Collections用的颇多,主要利用Java的多态的特性,使得工厂可以产生基类的同时注入子类实现。如:


public interface Food {



    /**

     * 使得所有食物都有一个共有的introduce方法

     */

    public void introduce();

}



/**

 * 定义食物的子类:鱼

 */

public class Fish implements Food{



    @Override

    public void introduce() {

        System.out.println("i am a fish");

    }

}



/**

 * 食物的子类,水果

 */

public class Fruit implements Food {

    @Override

    public void introduce() {

        System.out.println("i am the fruit");

    }

}



/**

 * 通过反射机制实现的工厂

 */

public class FoodFactory {



    public static Food getFood(String type) {

        Food food = null;

        try {

            food = (Food) Class.forName("info.zhw." + type).newInstance();

        } catch (ClassNotFoundException e) {

            e.printStackTrace();

        } catch (InstantiationException e) {

            e.printStackTrace();

        } catch (IllegalAccessException e) {

            e.printStackTrace();

        }

        return food;

    }

}

FoodFactory就利用了基类,返回了该类型的子类型。

3、不必在每次调用他们的时候都创建一次对象。

这使得不可变类可以使用预先构建好的实例,或者将构建好的实例缓存起来,进行重复利用,从而避免了创建不必要的重复对象。Boolean.valueOf(boolean b)方法说明了这项技术,它从来不创建对象。


 /**

     * Returns a {@code Boolean} instance for the specified boolean value.

     * <p>

     * If it is not necessary to get a new {@code Boolean} instance, it is

     * recommended to use this method instead of the constructor, since it

     * returns its static instances, which results in better performance.

     *

     * @param b

     *            the boolean to convert to a {@code Boolean}.

     * @return {@code Boolean.TRUE} if {@code b} is equal to {@code true},

     *         {@code Boolean.FALSE} otherwise.

     */

    public static Boolean valueOf(boolean b) {

        return b ? Boolean.TRUE : Boolean.FALSE;

    }


 /**

     * The {@code Boolean} object that represents the primitive value

     * {@code true}.

     */

    public static final Boolean TRUE = new Boolean(true);



    /**

     * The {@code Boolean} object that represents the primitive value

     * {@code false}.

     */

    public static final Boolean FALSE = new Boolean(false);

使用构造函数,调用其中的方法,则实例化一个类是必不可少的步奏,而是使用静态工厂方法,则可以对对象进行重复利用,这个特点在单例模式中使用颇多。其将构造方法私有,只能通过getInstance()获取实例,从而达到实例重复利用的目的。

4、使代码简洁

与第一点有点雷同,主要也是在方便理解的基础上作出的改进。


3.缺点从何体现

1、如果类不含有公有或受保护构造器,就不能被子类化。

2、和静态方法实际上没有任何区别。其无法在API文档中明确标出,推荐使用管用名称管理。

下面是 静态工厂方法的一些惯用的名称:

valueof,getInstance,newInstance,getType,newType 等等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值