一. 前言
1.1 定义
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。
2.1 特点
- 单例类只能有一个实例。
- 单例类必须自己创建自己的唯一实例。
- 单例类必须给所有其他对象提供这一实例。
单例模式保证了全局对象的唯一性,比如系统启动读取配置文件就需要单例保证配置的一致性。
二. 实现方式
2.1 饿汉式
**优点:**线程安全,在类加载(ClassLoader)的同时已经创建好了一个静态对象,调用时反应速度快
**缺点:**对象提前创建,所以会占用一定内存,
package com.base.learn;
/**
* 单例涉及模式:饿汉式
*/
public class SingletonTest1 {
public static void main(String[] args) {
Bank bank1 = Bank.getInstance();
Bank bank2 = Bank.getInstance();
System.out.println(bank2 == bank2);
}
}
class Bank {
// 1. 私有化类的构造器
private Bank() {
}
// 2. 内部创建类的对象
// 4. 要求此对象也必须声明为静态的
private static Bank instance = new Bank();
// 3. 提供公共的静态的方法,返回类的对象
public static Bank getInstance() {
return instance;
}
}
2.1 懒汉式
优点:
缺点: 线程不安全,后续学习多线程后,完善下面代码
package com.base.learn;
/**
* 懒汉式
*/
public class SingletonTest2 {
public static void main(String[] args) {
Order order1 = Bank.getInstance();
Order order2 = Bank.getInstance();
System.out.println(order1 == order2);
}
}
class Order {
//1. 私有化类的构造器
private Order() {
}
// 2. 声明当前类对象,没有初始化
// 4. 此对象也必须声明为 static 的
private static Order instance = null;
// 3. 声明 public static 的返回当前类对象的方法
public static Order getInstance() {
if(instance == null){
instance = new Order();
}
return instance;
}
}
其它场景及写法后续学习多线程后,补充完善…