一、概述
单例模式主要是为了避免因为创建了多个实例造成资源的浪费,且多个实例由于多次调用容易导致结果出现错误,而使用单例模式能够保证整个应用中有且只有一个实例。
二、定义
定义:只需要三步就可以保证对象的唯一性
- (1) 不允许其他程序用new对象
- (2) 在该类中创建对象
- (3) 对外提供一个可以让其他程序获取该对象的方法
对比定义:
- (1) 私有化该类的构造函数
- (2) 通过new在本类中创建一个本类对象
- (3) 定义一个公有的方法,将在该类中所创建的对象返回
三、类图
四、代码实现
单例模式中,由于创建类的时间不用又分为两种单例类懒汉式单例类和饿汉式单例。
懒汉式单例类:实例对象在第一次被调用时,才会将自己实例化,所以被形象的称之为懒汉式单例类。
/**
* 单例模式——懒汉式单例类
*/
public class SingleCaseLazy {
// 存放实例对象
private static volatile SingleCaseLazy singleCaseLazy;
// 私有化构造器,阻止被其他类new出来
private SingleCaseLazy() { }
// 外界通过此类获取本类对象
public static SingleCaseLazy getInstance() {
// 先判断实例是否存在,不存在再加锁处理
if (singleCaseLazy == null) {
// 在同一个时刻加了锁的那部分只有一个线程可以进入
synchronized (SingleCaseLazy.class) {
// 防止多线程情况下,线程都到达锁上等待时,等待完成进入再次创建实例
if (singleCaseLazy == null) {
// 创建实例
singleCaseLazy = new SingleCaseLazy();
}
}
}
// 返回实例
return singleCaseLazy;
}
public void description() {
System.out.println("SingleCaseLazy Class successful......");
}
}
饿汉式单例类:静态初始化方式在自己被加载时将自己实例化,所以被形象的称之为饿汉式单例。
/**
* 单例模式——饿汉式单例类
*/
public class SingleCaseHungry {
// 存放实例对象
private static SingleCaseHungry singleCaseHungry = new SingleCaseHungry();
// 私有化构造器
private SingleCaseHungry() { }
// 外界通过此类获取本类对象
public static SingleCaseHungry getInstance() {
// 返回实例
return singleCaseHungry;
}
public void description() {
System.out.println("SingleCaseHungry Class successful......");
}
}
测试代码:
/**
* 测试代码
*/
public class SingleCaseDemo {
public static void main(String[] args) {
// 懒汉式单例类
SingleCaseLazy singleCaseLazy = SingleCaseLazy.getInstance();
singleCaseLazy.description();
// 饿汉式单例类
SingleCaseHungry singleCaseHungry = SingleCaseHungry.getInstance();
singleCaseHungry.description();
}
}