天天看点

用工厂方法替代构造器

代码样例

public class Singleton {
    private static Singleton instance;

    private Singleton() {
    }

    public static Singleton getInstance() {
        instance = instance == null ? new Singleton() : instance;
        return instance;
    }
}      

静态工厂方法相较于构造器的优势

优势1:它们有名字

如果构造器本身没有确切的描述正被返回的参数,那么具有适当名称的静态工厂方法会更容易使用,产生的客户端代码也具有易读性。

优势2:不必再每次调用的时候都创建一个新的对象

不可变类可以使用预先构建好的实例,或者将构建好的实例缓存起来,进行重复的利用,从而避免创建不必要的重复对象。

优势3:可以反回原返回类型的任意子类型

让我们在选择返回类型的时候具有很多灵活性。

public abstract class Shape {
    private final static String PACKAGE_NAME = "com.chenxinbao.effectivejava.";
    public static Shape getInstance(String className)
            throws InstantiationException, IllegalAccessException, ClassNotFoundException {
        Shape isntance = (Shape) Class.forName(PACKAGE_NAME + className).newInstance();
        return isntance;
    }
    @Override
    public String toString() {
        return "Shape [getClass()=" + getClass() + ", hashCode()=" + hashCode() + ", toString()=" + super.toString()
                + "]";
    }

    private class Rectangle extends Shape {
    }

    private class Circle extends Shape {
    }

    public static void main(String[] args)
            throws InstantiationException, IllegalAccessException, ClassNotFoundException {
        Shape shape = Shape.getInstance("Circle");
        System.out.println(shape);
    }
}      

输出结果:

Shape [getClass()=class com.chenxinbao.effectivejava.Circle, hashCode()=1829164700, toString()=com.chenxinbao.effectivejava.Circle@6d06d69c]      

  

优势4:所返回的对象的类可以随着每次调用而发生变化,取决于静态工厂方法的参数值

------------恢复内容结束------------