单例模式精讲

来源:互联网 发布:java重要知识点 编辑:程序博客网 时间:2024/06/06 15:54

思想精髓

使得一个类只能够创建一个对象。

概述

所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。

设计思想

如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必须将类的构造方法的访问权限设置为 private,这样,就不能用 new 操作符在类的外部产生类的对象了,但在类内部仍可以产生该类的对象。
因为在类的外部开始还无法得到类的对象,只能调用该类的某个静态方法以返回类内部创建的对象,静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象的变量也必须定义成静态的。

单例模式结构图

这里写图片描述

两种单例模式

饿汉式,懒汉式

饿汉式

所谓饿汉式,就是在类加载时就创建单例类的实例对象。

代码示例

package SingletonTest;/** * Created by SSSomebody on 2017/4/27. */public class SingletonE {    //1.在类的内部创建一个类的实例    //2.私有化此对象,通过公共方法来调用    private static SingletonE singletonE = new SingletonE();    //3.私有化构造器,使得在类的外部不能够调用此构造器    private SingletonE(){}    //4.创建公共方法    public static SingletonE getInstance(){        return singletonE;    }}

懒汉式

所谓懒汉式,就是在需要的时候才会创建单例类的实例对象。也就是懒加载。

简单实现

package SingletonTest;/** * Created by SSSomebody on 2017/4/27. */public class SingletonL {    private static SingletonL singleL ;    private SingletonL() {}    public static SingletonL getInstance(){        //因为创建实例的过程并非原子操作,        //所以在多线程下,存在线程安全问题        if (singleL == null) {            singleL = new SingletonL();        }        return singleL;    }}

线程安全的懒汉式

package SingletonTest;/** * Created by SSSomebody on 2017/4/27. */public class SingletonLSafe {    private static SingletonLSafe singletonLSafe;    private SingletonLSafe() {}    public static SingletonLSafe getInstance(){        //创建实例后,可防止线程进入同步方法,以提高效率        if (singletonLSafe == null) {            //对于一般的方法而言,使用同步代码块,可以考虑使用this            //对于静态方法而言,可以使用当前类本身充当锁            synchronized (SingletonLSafe.class) {                if (singletonLSafe == null) {                    singletonLSafe = new SingletonLSafe();                }            }        }        return singletonLSafe;    }}
0 0
原创粉丝点击