文章目录
- 概念
- 实现的代码方式
- 1.饿汉式代码实现
- 2.懒汉式代码实现
- 3.双层检查代码实现
- 4.内部类的方式代码实现
- 总结
概念
基本概念:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
概述:单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
注意:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
实现的代码方式
1.饿汉
2.懒汉
3.双层检查
4.内部类
1.饿汉式代码实现
/**
* @Author chenxintao
* @Date 2022/10/25 17:15
* @Version 1.0
* 单例模式,保证全局唯一,即实例对象时只有一个入口,故私有构造方法
* 饿汉模式,默认直接加载,线程安全,损耗较大
*/
public class Singleton {
public static Singleton singleton = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return singleton;
}
public void method(){
System.out.println("使用了饿汉模式,直接加载");
}
public static void main(String[] args) {
Singleton instance = Singleton.getInstance();
Singleton instance1 = Singleton.getInstance();
System.out.println(instance);
System.out.println(instance1);
instance.method();
instance1.method();
}
}
2.懒汉式代码实现
/**
* @Author chenxintao
* @Date 2022/10/25 17:26
* @Version 1.0
* 单例模式,保证全局唯一,即实例对象时只有一个入口,故私有构造方法
优点:延迟加载(需要的时候才去加载),适合单线程操作
缺点: 线程不安全,在多线程中很容易出现不同步的情况,如在数据库对象进行的频繁读写操作时,不可使用
*/
public class LazySingleton {
/* 持有私有静态实例,防止被引用,此处赋值为null,目的是实现延迟加载 */
private static LazySingleton instance = null;
/* 私有构造方法,防止被实例化 */
private LazySingleton(){}
/** 延迟加载 */
public static LazySingleton getInstance() {
if (instance == null){
instance = new LazySingleton();
}
return instance;
}
protected void method() {
System.out.println("饿汉模式,懒加载。。");
}
}
3.双层检查代码实现
/**
* @Author chenxintao
* @Date 2022/10/25 17:34
* @Version 1.0
* 单例模式,保证全局唯一,即实例对象时只有一个入口,故私有构造方法
* 优点:线程安全,支持延时加载,调用效率高
* 缺点: 写法复杂,不简洁
* 在饿汉的模式下增强
*/
public class DoubleCheckSingleton {
private static DoubleCheckSingleton instance = null;
private DoubleCheckSingleton(){}
protected static DoubleCheckSingleton getInstance(){
if (instance == null){
synchronized (DoubleCheckSingleton.class){
if (instance == null){
instance = new DoubleCheckSingleton();
}
}
}
return instance;
}
public void method(){
System.out.println("使用了加锁双层检查模式,懒加载");
}
public static void main(String[] args) {
DoubleCheckSingleton.getInstance().method();
}
}
4.内部类的方式代码实现
/**
* @Author chenxintao
* @Date 2022/10/25 17:46
* @Version 1.0
* 单例模式,保证全局唯一,即实例对象时只有一个入口,故私有构造方法
* 优点:延迟加载,线程安全(java中class加载时互斥的),也减少了内存消耗,推荐使用内部类方式。
*/
public class SingletonInner {
/**
* 内部类实现单例模式
* 延迟加载,减少内存开销
*/
private static class SingletonHolder {
private static SingletonInner instance = new SingletonInner();
}
private SingletonInner() {}
private static SingletonInner getInstance(){
return SingletonHolder.instance;
}
public void method(){
System.out.println("使用内部类的模式,延迟加载");
}
}
总结
最优解是内部类的方式,次优解是双层检查模式,懒汉式请不要使用。