1.核心作用
单例模式(Singleton Pattern)是确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
2.应用场景
- 项目中,读取配置文件的类,一般也只有一个对象。没有必要每次使用配置文件数据,每次new一个对象去读取。
- 数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。
- 在Spring中,每个Bean默认就是单例的,这样做的优点是Spring容器可以管理
3.单利模式的优点
由于单例模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对 象,然后永久驻留内存的方式来解决。
单例模式可以在系统设置全局的访问点,优化环共享资源访问,例如可以设计一个单例类,负责所有数据表的映射处理4.常见的四种单例模式
• 饿汉式(线程安全,调用效率高。 但是,不能延时加载。)
• 懒汉式(线程安全,调用效率不高。 但是,可以延时加载。) • 静态内部类式(线程安全,调用效率高。 但是,可以延时加载) • 枚举单例(线程安全,调用效率高,不能延时加载)5.代码实例
第一种:懒汉式
/** * @ClassName : SingletonL * @Description: 懒汉式单利模式(线程安全,调用效率不高,但是,可以实现延时加载) * @Author: 13394 * @CreateDate: 2018/11/14 15:23 * @Version: 1.0 */public class SingletonL { private static SingletonL instance=null; private SingletonL(){ } public static SingletonL getInstance(){ if (null==instance){ instance=new SingletonL(); } return instance; } }
第二种:饿汉式
/** * @ClassName : SingletonE * @Description: 饿汉式单利模式(线程安全,调用效率高,但是,不可以延时加载) * @Author: 13394 * @CreateDate: 2018/11/14 14:29 * @Version: 1.0 */public class SingletonE implements Serializable{ //防止被引用 private static SingletonE instance=new SingletonE(); //防止被实例化 private SingletonE(){ //防止反射调用私有的构造方法 if (null!=instance){ throw new RuntimeException(); } } public static SingletonE getInstance(){ return instance; } //反序列化时,如果定义了readResolve()则直接返回此方法指定的对象。而不需要单独再创建新对象! private Object readResolve() throws ObjectStreamException { return instance; }}
第三种:静态内部类
public class SingletonJt { private static class staticFactory { private static SingletonJt instance = new SingletonJt(); } private SingletonJt() { } public static SingletonJt getInstance() { return staticFactory.instance; }}
第四种:枚举
/*** @ClassName : Singletonenum* @Description: 枚举单利模式(线程安全,调用效率高,不能延时加载)* @Author: 13394* @CreateDate: 2018/11/14 15:31* @Version: 1.0*/public enum Singletonenum {INSTANCE;}
如何选用?
– 单例对象 占用 资源 少,不需要 延时加载:• 枚举式 好于 饿汉式– 单例对象 占用 资源 大,需要 延时加载:• 静态内部类式 好于 懒汉式