单例模式
什么是设计模式
设计模式( Design Pattern) 是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
使用设计模式的目的
使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
Java设计模式有哪些
基本模式有23种:
- 单例模式
- 抽象工厂模式
- 建造者模式
- 工厂模式
- 原型模式
- ……
单例模式
在开发过程中,有些对象我们只需要一个,比如配置文件、工具类、线程池、缓存、日志对象等。
如果创造出多个实例,就会导致许多问题,比如占用过多资源,不一致的结果等
单例模式分类
常用的单例模式有两种,一种叫懒汉模式,一种叫饿汉模式。
饿汉模式
步骤
1.将构造方法私有化,不允许外部直接创建对象
2.在类内部创建
类的唯一实例,使用private static
修饰
3.提供一个用于获取实例的方法,使用public static
修饰
1 | public class Singleton |
测试
1 | public static void main(String[] args) |
运行结果
1 | s1和s2是同一个实例 |
为什么叫饿汉模式
不管程序是否需要这个对象的实例,总是在类加载的时候就先创建好实例,理解起来就像不管一个人想不想吃东西,他都把吃的先买好存着,如同饿怕了一样。
懒汉模式
步骤
- 将构造方式私有化,不允许外边直接创建对象
- 在类内部
声明
类的唯一实例,使用private static修饰 - 提供一个用于获取实例的方法,使用public static修饰。当第一个用户来获取的时候,才创建一个实例,后面就不需要创建了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20public class Singleton2
{
// 1.将构造方式私有化,不允许外边直接创建对象
private Singleton2()
{
}
// 2.声明类的唯一实例,使用private static修饰
private static Singleton2 instance;
// 3.提供一个用于获取实例的方法,使用public static修饰
public static synchronized Singleton2 getInstance()
{
//第一次获取的时候,创建实例
if (instance == null)
{
instance = new Singleton2();
}
return instance;
}
}
测试
1 | public static void main(String[] args) |
运行结果
1 | s3和s4是同一个实例 |
为什么叫懒汉模式
当程序需要这个实例的时候才去创建对象,就如同一个人懒的饿到不行了才去吃东西。
区别
- 饿汉模式的特点是加载类时比较慢,但运行时获取对象的速度比较快,
线程安全
- 懒汉模式的特点是加载类时比较快,但运行时获取对象的速度比较慢,
线程不安全
如果一个对象使用频率不高,占用内存还特别大,明显就不合适用饿汉式了。这时应该使用懒汉模式。