JAVA设计模式 - 单例模式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
饿汉式单例
/**
* @author spp
* @date 2020-10-17 21:26
* 饿汉式单例,可能会浪费空间
**/
public class Hungry {
private final static Hungry HUNGRY = new Hungry();
private Hungry(){
}
public static Hungry getInstance(){
return HUNGRY;
}
}
懒汉式单例
/**
* @author spp
* @date 2020-10-17 21:30
* 懒汉式单例
**/
public class LazyMan {
private static LazyMan lazyMan;
private LazyMan(){
}
public static LazyMan getInstance(){
//该方法为线程不安全的
if (null == lazyMan){
lazyMan = new LazyMan();
}
return lazyMan;
}
}
改进
懒汉式单例加双重锁,DCL 懒汉式
/**
* @author spp
* @date 2020-10-17 21:30
* 懒汉式单例
**/
public class LazyMan {
/**
* volatile 保证可见性,防止指令重排
*/
private volatile static LazyMan lazyMan;
private static final ReentrantLock LOCK = new ReentrantLock();
private LazyMan(){
System.out.println(Thread.currentThread().getName());
}
public static LazyMan getInstance(){
//DCL 懒汉式
if (null == lazyMan){
LOCK.lock();
try {
if (null == lazyMan){
lazyMan = new LazyMan();
}
}finally {
LOCK.unlock();
}
}
return lazyMan;
}
}
静态内部类
/**
* @author spp
* @date 2020-10-17 21:44
* 静态内部类
**/
public class Holder {
private Holder(){
}
private static class InnerClass{
private static final Holder HOLDER = new Holder();
}
public static Holder getInstance(){
return InnerClass.HOLDER;
}
}
==以上都方法可以说不安全,Java有一种强大的东西叫做反射~==
枚举类单例(推荐)
/**
* @author spp
* @date 2020-10-17 21:48
* 枚举类单例
**/
public enum EnumSingle {
INSTANCE;
public Single getInstance(){
return instance;
}
private final Single instance;
EnumSingle() {
instance = new Single();
}
public static void main(String[] args) {
//调用
EnumSingle.INSTANCE.getInstance();
}
}
class Single{
}
网友评论