设计模式_17:单例模式

来源:互联网 发布:怎么卸载还原软件 编辑:程序博客网 时间:2024/05/29 10:30

单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点(原书)

举个例子:例如计划生育,每对夫妇只能有一个孩子:

public class Main {    public static void main(String[] args) {        Children children_1 = Children.getInstance();        Children children_2 = Children.getInstance();        System.out.println(children_1 == children_2);    }}class Children {    private static Children children;    private Children() {}    public static Children getInstance() {        if (null == children){            children = new Children();        }        return children;    }}

运行结果:

true

可以看到,Children类的构造方法被私有化了,而取得该类对象的方法只有调用getInstance方法,并且getInstance方法只有在静态对象children为null是才会生成对象返回,所以children_1和children_2指向的都是同一个对象。


但是在多线程的情况下,还是会有实例被多次构造(也就是children = new Children();这句被重复执行)的可能,因此需要加上同步关键字synchronized:

    public static Children getInstance(){        synchronized (Children.class){            if (null == children){                children = new Children();            }        }        return children;    }

但这样就会造成性能的问题:每次调用getInstance方法都要加锁执行同步块里面的内容,可以优化一下,在外层加一个是否为空的判断:

    public static Children getInstance(){        if (null == children){            synchronized (Children.class){                if (null == children){                    children = new Children();                }            }        }        return children;    }

上面的例子都属于懒汉式的单例模式:只有调用getIntance才会构建对象

下面看看饿汉式的,在类加载的时候就把对象给new出来了,因此就不存在多线程问题:

class Children {    private final static Children children = new Children();    private Children(){}    public static Children getInstance(){        return children;    }}