1. 什么是单例模式
单例模式属于创建者模式,一个类只有一个全局实例
2. 单例模式的角色组成
只有一个角色,就是单例角色本身
3. 代码示例
单例模式有两种加载模式:懒汉式创建实例,饿汉式创建实例
- 懒汉式创建实例
package com.lt.patterns.singleton;
/**
* 单例模式-懒汉式创建单例:在第一次使用时创建实例(适合耗费系统资源较大,使用频率较低的实例创建)
* @author lt
* @date 2019年4月15日
* @version v1.0
*/
public class SingleInstance_lazzy {
/**
* 使用volatile修饰保证instance在所有线程中同步,并且可以保证线程安全
*/
private static volatile SingleInstance_lazzy instance = null;
/**
* private修饰,避免在外部被调用
*/
private SingleInstance_lazzy(){
System.out.println("SingleInstance_lazzy单例被创建");
}
/**
* volatile,synchronized保证线程安全,可以在多线程中使用;但是每次访问会加锁,同步,消耗额外的系统资源
* @author lt
* @date 2019年4月15日
* @return
*/
public static synchronized SingleInstance_lazzy getInstance(){
System.out.println("SingleInstance_lazzy开始创建单例");
if(instance==null){
instance = new SingleInstance_lazzy();
}
return instance;
}
}
- 饿汉式创建实例
package com.lt.patterns.singleton;
/**
* 单例模式-饿汉式创建实例:在类加载时创建实例(适合使用频繁,耗费系统资源较少的实例创建)
* @author lt
* @date 2019年4月15日
* @version v1.0
*/
public class SingleInstance_hungary {
private static final SingleInstance_hungary instance = new SingleInstance_hungary();
private SingleInstance_hungary(){
System.out.println("SingleInstance_hungary单例被创建");
}
public static SingleInstance_hungary getInstance(){
System.out.println("SingleInstance_hungary开始创建单例");
return instance;
}
}
- 客户端
package com.lt.patterns.client;
import org.junit.Test;
import com.lt.patterns.singleton.SingleInstance_hungary;
import com.lt.patterns.singleton.SingleInstance_lazzy;
/**
* 单例模式
* @author lt
* @date 2019年4月15日
* @version v1.0
*/
public class Client {
@Test
public void test1(){
SingleInstance_hungary.getInstance();
}
@Test
public void test2(){
SingleInstance_lazzy.getInstance();
}
}
4. 单例模式的特点
- 可以节省系统开销,共享对象,加快对象的访问速度