简介
单例模式是JAVA23中设计模式中最简单的形式之一。
单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。例如,Windows 中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗口而造成内存资源的浪费,或出现各个窗口显示内容的不一致等错误。
优点
- 单例模式只有一个实例对象,这样在内存中的占用就会很低,减少内存开支。
- 单例模式只生成一个对象,这样就避免了对于一个频繁使用对象的创建和销毁,提高了运行时的程序性能。
缺点
- 单例模式实例化的对象的职责过重,在一定程度上违背了“单一职责原则”。
- 滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;
- 如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。
示例一
package com.example.demo.design.singleton;
/**
* @author : sunzhinan
* create at: 2020/4/20 23:05
* @description: 单例模式——饿汉式
*/
public class Singleton01 {
private static final Singleton01 SINGLETON_01 = new Singleton01();
private Singleton01() {
}
public static Singleton01 getInstance(){
return SINGLETON_01;
}
}
示例二
package com.example.demo.design.singleton;
/**
* @author : sunzhinan
* create at: 2020/4/20 23:06
* @description: 单例模式——懒汉式:线程不安全
*/
public class Singleton02 {
private static Singleton02 SINGLETON02 = null;
private Singleton02() {
}
public static Singleton02 getInstance(){
if (SINGLETON02 == null){
SINGLETON02 = new Singleton02();
}
return SINGLETON02;
}
}
示例三
package com.example.demo.design.singleton;
/**
* @author : sun
* create at: 2020/4/20 23:10
* @description: 单例模式——懒汉式:线程安全,synchronized
*/
public class Singleton03 {
private static Singleton03 SINGLETON03 = null;
private Singleton03() {
}
public static synchronized Singleton03 getInstance() {
if (SINGLETON03 == null)
{
SINGLETON03 = new Singleton03();
}
return SINGLETON03;
}
}
示例四
package com.example.demo.design.singleton;
/**
* @author : sun
* create at: 2020/4/20 23:16
* @description: 单例模式——懒汉式:线程安全,volatile,双重校验
*/
public class Singleton04 {
private static volatile Singleton04 SINGLETON04 = null;
private Singleton04() {
}
public static Singleton04 getInstance(){
if(SINGLETON04 == null){
synchronized (Singleton04.class){
if(SINGLETON04 == null){
SINGLETON04 = new Singleton04();
}
}
}
return SINGLETON04;
}
}
示例五
package com.example.demo.design.singleton;
/**
* @author : sun
* create at: 2020/4/20 23:23
* @description: 单例模式——私有静态内部类
*/
public class Singleton05 {
private static class SingletonHandler{
private static final Singleton05 SINGLETON_05 = new Singleton05();
}
private Singleton05() {
}
public static Singleton05 getInstance(){
return SingletonHandler.SINGLETON_05;
}
}
应用场景
单例模式的应用场景还是比较多的,比如我们常用的数据库连接池一般也是采用单例模式;Spring的bean默认采用单例模式。