设计模式分为三种类型:创建型模式、结构型模式、行为型模式,共23种。
单例设计模式
单例设计模式属于创建型模式,就是采取一定的方法保证整个软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个获取该对象实例的方法(静态方法)。
单例模式的几种写法
饿汉式(静态常量)
步骤:
1、构造器私有化;
2、类内部创建一个静态的对象实例并私有化;
3、对外暴露一个静态的公共方法getInstance()
1 | public class SingletonTest1 { |
优点:在类装载时就完成了对象的实例化,避免了线程同步问题。
缺点:由于在类加载时就完成了类的实例化,没有达到懒加载的效果,如果这个实例对象一直没有使用过,就会造成内存的浪费。
饿汉式(静态代码块)
1 | package com.zyz.singleton; |
懒汉式(线程不安全)
1 | public class SingletonTest3 { |
达到了懒加载的效果,但是存在线程安全问题,在多线程环境下可能会创建多个对象实例。
懒汉式(线程安全,同步方法)
使用synchronized
关键字修饰getInstance()方法
双重检查
解决了线程安全问题,懒加载问题,同时保证了效率,在实际开发中推荐使用。
1 | public class SingletonTest4 { |
静态内部类
静态内部类不会自动加载,只有调用静态内部类的方法,静态域,或者构造方法的时候才会加载,并且只加载一次。
1 | public class SingletonTest5 { |
枚举
1 | public class SingletonTest6 { |
单例模式的使用场景
- 需要频繁创建和销毁的对象
- 创建对象时耗时过多或耗费资源过多
- 工具类对象
- 频繁访问数据库或文件的对象(比如数据源、session工厂等)