effective--构造器和静态工厂方法

来源:互联网 发布:中国历史故事网软件 编辑:程序博客网 时间:2024/04/28 04:44

effective--构造器和静态工厂方法

一、静态工厂方法和构造器的异同点。

相同点:都可以用于实例化对象。

不同点:构造器实例化对象后没法精确地表达出实例化对象的用途和特点,而静态工厂方法可以比较精确地表达出实例化的对象的用途和特点。

二、使用静态工厂方法的优点

(1)有名称,可以使产生的代码更加容易阅读,更加容易表明产生的对象的特点和用途。

/** * 演示静态工厂方法 * * @author LIUTAO * @version 2017/4/28 * @see * @since */public class Person {    private String name;    private int age;    private String ownCar;    private String ownHouse;    public Person() {    }    public Person(String name, int age, String ownCar, String ownHouse) {        this.name = name;        this.age = age;        this.ownCar = ownCar;        this.ownHouse = ownHouse;    }    /**     * 创建有车的人     * @param name     * @param age     * @param ownCar     * @return     */    public static Person personHasCar(String name,int age,String ownCar){        return new Person(name,age,ownCar,null);    }    /**     * 创建有房的人     * @param name     * @param age     * @param ownHouse     * @return     */    public static Person personHasHouse(String name,int age,String ownHouse){        return  new Person(name,age,null,ownHouse);    }    /**     * 获取男性     * @param name     * @param age     * @param ownCar     * @param ownHouse     * @param sex     * @return     */    public static Person newMan(String name,int age,String ownCar,String ownHouse,String sex){        return new Man(name,age,ownCar,ownHouse,sex);    }    @Override    public String toString() {        return "Person{" +                "name='" + name + '\'' +                ", age=" + age +                ", ownCar='" + ownCar + '\'' +                ", ownHouse='" + ownHouse + '\'' +                '}';    }}

/** * 演示静态工厂方法 * * @author LIUTAO * @version 2017/4/28 * @see * @since */public class Test {    public static void main(String[] args) {        System.out.println(Person.personHasCar("liubei",45,"BMW"));    }}

(2)调用的时候并不需要每次都创建一个新对象。

 这中情况就需要类用有此类的相应对象作为静态变量,在静态方法中直接返回相应的静态变量即可。

 注意静态变量和静态方法是在类首次被使用的时候初始化,而且类的静态变量在整个程序中只能包含一个,所以这就保证了调用的时候不需要每次都创建一个新  的对象。

(3)可以返回类的任何子类型对象。

 如下Man类是Person的子类。我们现在可以在Person类中使用静态方法创建Man类的实例。

/** * 演示静态工厂方法 * * @author LIUTAO * @version 2017/4/28 * @see * @since */public class Man extends Person{    private String sex;    public Man(String name, int age, String ownCar, String ownHouse, String sex) {        super(name, age, ownCar, ownHouse);        this.sex = sex;    }}

(4)代码更加简洁,不需要重复指明参数,对于这一点目前在JDK1.7中已经不需要重复指明参数了。

三、使用静态工厂方法的缺点

(1)如果类不包含public或protect的构造方法将不能够被继承。

(2)和普通的静态方法相比,不能明确表明静态方法是否是用于实例化对象的。

四、惯用名称 

valueOf – 类型转换方法.该方法返回的实例与它的参数具有相同的值 

getInstance – 返回的实例是通过方法的参数来描述的.对于单例来说,该方法没有参数并返回唯一实例 

newInstance – 确保返回的每个实例都与其他实例不同,其他功能同上 

1 0