WeLi的java学习程序员Java学习笔记

23天学习23种设计模式——单例模式

2017-08-23  本文已影响80人  soberbad

是什么——什么是单例模式

单例模式(Singleton Pattern),是一种创建型设计模式,它规定了一个类有且只有一个实例存在

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

单例模式类图

为什么——为什么要用单例模式

节约系统资源,避免频繁创建对象。

怎么做——怎么实现单例模式

/**
 * 懒汉式单例模式
 */
public class LazySingleton {
    
    private static LazySingleton INSTANCE;
    
    private LazySingleton(){
        
    }
    
    public static synchronized LazySingleton getInstance(){
        if(INSTANCE == null){
            INSTANCE = new LazySingleton();
        }
        return INSTANCE;
    }
    
}

/**
 * 饿汉式单例模式
 */
public class EagerSingleton {
    
    private static EagerSingleton INSTANCE = new EagerSingleton();
    
    private EagerSingleton(){
        
    }
    
    public static EagerSingleton getInstance(){
        return INSTANCE;
    }
    
}
/**
 * 双重加锁检查单例模式
 */
public class DoubleCheckedLockSingleton {

    private static volatile DoubleCheckedLockSingleton INSTANCE;

    private DoubleCheckedLockSingleton(){

    }

    public static DoubleCheckedLockSingleton getInstance(){
        if(INSTANCE == null){
            synchronized (DoubleCheckedLockSingleton.class){
                if(INSTANCE == null){
                    INSTANCE = new DoubleCheckedLockSingleton();
                }
            }
        }
        return INSTANCE;
    }
}

4.静态内部类单例模式
懒加载,线程安全。Effective Java推荐的方法。

/**
 * 静态内部类单例模式
 */
public class StaticNestedClassSingleton {

    private static class SingletonHolder{
        private static final StaticNestedClassSingleton INSTANCE 
         = new StaticNestedClassSingleton();        
    }

    private StaticNestedClassSingleton(){

    }
    
    public static StaticNestedClassSingleton getInstance(){
        return SingletonHolder.INSTANCE;
    }
}

5.枚举单例模式
简单,线程安全,非懒加载,能避免反序列化生成新的对象。

/**
 * 枚举单例模式
 */
public enum EnumSingleton {
    INSTANCE;
}

上一篇 下一篇

猜你喜欢

热点阅读