单例模式又叫做 Singleton 模式, 指的是一个类, 在一个 JVM 里, 只有一个实例存在.
单例模式的两种
饿汉式是立即加载的方式, 无论是否会用到这个对象, 都会加载.
如果在构造方法里写了性能消耗较大, 占时较久的代码, 比如建立与数据库的连接, 那么就会在启动的时候感觉稍微有些卡顿.
懒汉式是延迟加载的方式, 只有使用的时候才会加载. 并且有线程安全的考量 (鉴于同学们学习的进度, 暂时不对线程的章节做展开).
使用懒汉式, 在启动的时候, 会感觉到比饿汉式略快, 因为并没有做对象的实例化. 但是在第一次调用的时候, 会进行实例化操作, 感觉上就略慢.
看业务需求, 如果业务上允许有比较充分的启动和初始化时间, 就使用饿汉式, 否则就使用懒汉式
- /** 饿汉式单例模式 **/
- public class GiantDragon {
- // 私有化构造方法使得该类无法在外部通过 new 进行实例化
- private GiantDragon() { }
- // 准备一个类属性, 指向一个实例化对象. 因为是类属性, 所以只有一个
- private static GiantDragon instance = new GiantDragon();
- //public static 方法, 提供给调用者获取 12 行定义的对象
- public static GiantDragon getInstance(){
- return instance;
- }
- }
- /** 懒汉式单例模式 **/
- public class GiantDragon2 {
- // 私有化构造方法使得该类无法在外部通过 new 进行实例化
- private GiantDragon2() {}
- // 准备一个类属性, 用于指向一个实例化对象, 但是暂时指向 null
- private static GiantDragon2 instance;
- //public static 方法, 返回实例对象
- public static GiantDragon2 getInstance(){
- // 第一次访问的时候, 发现 instance 没有指向任何对象, 这时实例化一个对象
- if(null==instance){
- instance = new GiantDragon2();
- }
- // 返回 instance 指向的对象
- return instance;
- }
- }
- // 测试
- public static void main(String[] args) {
- // 通过 new 实例化会报错
- //GiantDragon giantDragon = new GiantDragon();
- // 只能通过 getInstance 得到对象
- GiantDragon g1 = GiantDragon.getInstance();
- GiantDragon g2 = GiantDragon.getInstance();
- GiantDragon g3 = GiantDragon.getInstance();
- // 都是同一个对象
- System.out.println(g1==g2);
- System.out.println(g1==g3);
- }
这个是面试的时候经常会考的点, 面试题通常的问法是:
什么是单例模式?
回答的时候, 要答到三元素
1. 构造方法私有化
2. 静态属性指向实例
3. public static 的 getInstance 方法, 返回第二步的静态属性
来源: http://www.bubuko.com/infodetail-3343385.html