在讲单例模式之前首先要知道什么是设计模式,那么什么是设计模式呢?
百度百科是这样解释的:设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。简单地说,设计模式是可以重复利用的解决方案。
设计模式的提出是在1995 人,是由4 为作者提出的,称为GoF,也就是“四人组”。
设计模式从结构上分为三类:
- 创建型
- 结构性
- 行为型
其中最简单的设计模式就是单例了,单例这种模式,尽量少用,也有将其称为“反模式”。
单例模式有什么好处 ?
1、控制资源的使用,通过线程同步来控制资源的并发访问;
2、控制实例产生的数量,达到节约资源的目的。
3、作为通信媒介使用,也就是数据共享,它可以在不建立直接关联的条件下,让多个不相关的两个线程或者进程之间实现通信。
常用的单例模式有两种:饿汉式、懒汉式。
单例模式的要领:
1.构造方法私有化
2.提供一个公开的静态的获取当前类型对象的方法
3.提供一个当前类型的静态变量
一、懒汉式
在类加载的时候不创建单例实例。只有在第一次请求实例的时候的时候创建,并且只在第一次创建后,以后不再创建该类的实例。
下面为懒汉式单例代码示例:
public class Singleton {
// 提供一个当前类型的静态变量
private static Singleton s;
// 构造方法私有化
private Singleton() {
}
// 提供一个公开的静态的获取当前类型对象的方法
public static Singleton getInstance() {
if (s == null) {
s = new Singleton();
}
return s;
}
}
二、饿汉式
在类被加载的时候,唯一实例已经被创建。
下面为饿汉式单例代码示例:
/*
* 饿汉式单例
*/
public class Admin {
//提供一个当前类型的静态变量,静态变量在类加载时创建,而且只执行一次
private static Admin a = new Admin();
// 构造方法私有化
private Admin() {
}
// 提供一个公开的静态的获取当前类型对象的方法
public static Admin getInstance() {
return a;
}
}
下面为测试是否是唯一实例:
public class Test {
public static void main(String[] args) {
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
Admin a1 = Admin.getInstance();
Admin a2 = Admin.getInstance();
System.out.println("懒汉式单例测试:"+(s1 == s2));
System.out.println(s1);
System.out.println(s1);
System.out.println("饿汉式单例测试:"+(a1 == a2));
System.out.println(a1);
System.out.println(a2);
}
}
测试结果如图所示:
由图可知,无论是懒汉式还是饿汉式单例,都取得了唯一实例。
注意:==两边如果是基本数据类型,比较的是两个基本类型的大小是否想等;==两边如果是引用数据类型,则比较的是内存地址,内存地址一样说明取得的是同一个实例。