创建型模式之单例模式
定义
1、定义:
确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
使用单例模式的时机是当实例存在多个会引起程序逻辑错误的时候。比如类似有序的号码生成器这样的东西,怎么可以允许一个应用上存在多个呢?Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。
常见应用场景:
- 项目中读取配置文件的类,一般也只有一个对象。没必要每次使用配置文件的时候,都new一个对象去读取;
- 数据库连接池的设计一般是单利模式,因为数据库的连接是很耗资源的;
- 在servlet中的Application也是单利模式;
- 在Spring中,每个Bean都是单利的,这样的优点就是Spring容器可以去管理;
- 在Servet编程中,每个servlet也是单例的;
- springMVC中的控制器也是单例的;
2、类图
1.类图分为三部分,依次是类名、属性、方法
2.以<<开头和以>>结尾的为注释信息
3.修饰符+代表public,-代表private,#代表protected,什么都没有代表包可见。
4.带下划线的属性或方法代表是静态的。
单例模式,它有以下几个要素:
- 私有的构造方法
- 指向自己实例的私有静态引用
- 以自己实例为返回值的静态的公有的方法
3、分类
常见的四种单例模式的实现方式:
-饿汉式(线程安全,调用效率高,不能延时加载)
-懒汉式(线程安全,调用效率不高,可延时加载)
-静态内部类式(线程安全,调用效率高,可延时加载)
-枚举单例(线程安全,调用效率高,不能延时加载,并且可以避免通过反射和序列化创建新对象)
饿汉式
所谓“懒汉式”与“饿汉式”的区别,是在于建立单例对象的时间不同。“懒汉式”是在你真正用到的时候才去建这个单例对象:
/饿汉式 public class SingletonTest01 { //类初始化装载的时候,初始化该对象(类初始化是天然的线程安全) private static SingletonTest01 instance = new SingletonTest01(); // 私有的构造器 private SingletonTest01() { } // 方法没有同步块,并发效率高 public static SingletonTest01 getInstance() { return instance; } }
懒汉式
/单例模式:懒汉式 public class SingletonTest02 { //类初始化装载的时候,不初始化该对象(延时加载,真正使用的时候再创建) private static SingletonTest02 instance;
private SingletonTest02() { } //方法需同步保证线程安全,调用效率低 public static synchronized SingletonTest02 getInstance() { if (instance != null) { return instance; } else { return new SingletonTest02(); } } }
每件事情最后的结果一定是好的,如果不好,说明还没到最后!