代码样例
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:所返回的对象的类可以随着每次调用而发生变化,取决于静态工厂方法的参数值
------------恢复内容结束------------
浙公网安备 33010602011771号