1. 目的
减少对象实例化次数,从而省略创建对象所花费的时间以及内存空间。
2. 什么是单例
用于产生一个对象的具体实例,它可以确保系统中一个类只生成一个实,这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
3. 解决什么问题
一个全局使用的类频繁地创建与销毁
4. 如何解决
判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
5. 何时使用
当您想控制实例数目,节省系统资源的时候。
6. 好处有两点
第一点:对于频繁使用的对象可以省略创建对象所花费的时间,对于那些重要级的对象而言,是非常可观的一笔系统开销
第二点:由于new操作的次数减少,因而对系统内存的使用频率也会降低,这减轻了GC压力,缩短GC停顿时间
7. 角色分配
Tables | Are |
---|---|
单例类 | 提高单例的工厂 |
使用者 | 获取并使用单例类 |
8. 代码清单
package com.one.design;
public class Singleton {
private static Singleton singleton;
/**
* 构造方法私有,权限只允许本类实例化
*/
private Singleton(){}
/**
* 懒汉式 线程不安全
* 1、支持懒加载
* 2、线程不安全
* 3、容易实现
*
* @return
*/
public static Singleton getInstance() {
if(singleton == null) {
return singleton = new Singleton();
}
return singleton;
}
}
class Singleton2 {
private static Singleton2 singleton2;
/**
* 构造方法私有,权限只允许本类实例化
*/
private Singleton2(){}
/**
* 懒汉式 线程安全
* 1、支持懒加载
* 2、线程安全
* 3、容易实现,使用线程同步,性能受到影响
*
* @return
*/
public static synchronized Singleton2 getInstance() {
if(singleton2 == null) {
return singleton2 = new Singleton2();
}
return singleton2;
}
}
class Singleton3 {
private static final Singleton3 singleton3 = new Singleton3() ;
/**
* 构造方法私有,权限只允许本类实例化
*/
private Singleton3(){}
/**
* 饿汉式
* 1、不支持懒加载
* 2、线程安全
* 3、容易实现
* @return
*/
public static Singleton3 getInstance() {
return Singleton3.singleton3;
}
}
class Singleton4 {
private static Singleton4 singleton4;
/**
* 构造方法私有,权限只允许本类实例化
*/
private Singleton4(){}
/**
* 双重锁定
* 1、支持懒加载
* 2、线程安全
* 3、复杂
* @return
*/
public static Singleton4 getInstance() {
if(singleton4 == null) {
synchronized (Singleton4.class) {
if(singleton4 == null ) {
singleton4 = new Singleton4();
}
}
}
return singleton4;
}
}
class Singleton5 {
/**
* 构造方法私有,权限只允许本类实例化
*/
private Singleton5(){}
private static class SingletonHolder{
private static Singleton5 singleton5 = new Singleton5();
}
/**
* 内部类
* 1、支持懒加载
* 2、线程安全
* 3、一般
* @return
*/
public static Singleton5 getInstance() {
return SingletonHolder.singleton5;
}
}