记得刚出来找工作时,面试官问完几个基础问题后,基本就会马上跳到设计模式问我,问我了解几种设计模式.我说单例模式、工厂方法模式、静态代理模式.他说那你先手写一个单例模式吧.我立马拿出笔和纸手写单例模式,不知道是不是我写的单例模式面试官不满意,还是我写的单例模式和鬼画符一样(面试时你回答问题时字迹工整,从某种程度上可以看出你的态度,我觉得我那时的字迹可能给了面试官一种不重视这次面试的感觉吧),总之最后的结果就是出门左拐.那次回去以后我好好的看了看单例模式,但是一直没有做记录,心中一直想着念着这件事,今日就了结这件事吧!.
一、为什么要使用单例模式
它能够避免实例对象的重复创建,不仅可以减少每次创建对象的时间开销,还可以节约内存空间;
能够避免由于操作多个实例导致的逻辑错误;
系统中可能存在一个对象贯穿整个应用程序,此时起到了全局统一管理控制的作用;
二、什么是单例模式
Singleton是一种创建型模式,指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点.(简单来说就是无论程序如何运行,采用单例设计模式的类(Singleton类)永远只会有一个实例化对象产生)
创建单例模式注意的点:
(1) 将采用单例设计模式的类的构造方法私有化(采用private修饰)。
(2) 在其内部产生该类的实例化对象,并将其封装成private static类型。
(3) 定义一个公有的获取实例的静态方法返回该类的实例。
三、如何使用单例模式
实现的方式有如下四种:
/**
*
* 单例模式的实现:饿汉式,线程安全 但效率比较低
*/
public class SingletonTest {
private static final SingletonTest instance = new SingletonTest();
private SingletonTest() {
}
public static SingletonTest getInstancei() {
return instance;
}
}
/**
* 单例模式的实现:懒汉式,非线程安全
*
*/
public class SingletonTest {
private static SingletonTest instance;
private SingletonTest() {
}
public static SingletonTest getInstance() {
if (instance == null)
instance = new SingletonTest();
return instance;
}
}
/**
* 懒汉式,线程安全,但是效率非常低
*
*/
public class SingletonTest {
private static SingletonTest instance;
private SingletonTest() {
}
public static synchronized SingletonTest getInstance() {
if (instance == null)
instance = new SingletonTest();
return instance;
}
}
/**
* 懒汉式,线程安全 并且效率高
*
*/
public class SingletonTest {
private static SingletonTest instance;
private SingletonTest() {
}
public static SingletonTest getIstance() {
if (instance == null) {
synchronized (SingletonTest.class) {
if (instance == null) {
instance = new SingletonTest();
}
}
}
return instance;
}
}
四、单例模式使用场景
1.日期工具类获取当前时间.(在做某些业务操作时,经常要设置更新时间,我们不可能每次都去new 当前时间,因为频繁的创建对象会耗费内存.一般都是将日期工具类设置成单例模式,每次需要获取当前时间时,就去获取,这样全局只有一个实例)
2.获取订单号的工具类(订单号是唯一的,一个实例产生的订单号是唯一的,如果多个实例用于产生订单号,容易导致操作多个实例造成逻辑错误)