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