在讲单例模式之前首先要知道什么是设计模式,那么什么是设计模式呢? 百度百科是这样解释的:设计模式(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); } }测试结果如图所示:
由图可知,无论是懒汉式还是饿汉式单例,都取得了唯一实例。
注意:==两边如果是基本数据类型,比较的是两个基本类型的大小是否想等;==两边如果是引用数据类型,则比较的是内存地址,内存地址一样说明取得的是同一个实例。