设计模式-单例模式

1.单例模式

在实际开发的场景中,部分对象只需要在程序中存在一份即可,因为存在多份没有什么意义。实现单例模式的方式有很多种,通常分为两种懒汉式(使用时在创建对象)和饿汉式(类加载时创建对象)。

1.1饿汉模式

java 复制代码
public class Singleton1 {
    private static final Singleton1 INSTACE = new Singleton1();

    private Singleton1(){

    }

    public static Singleton1 getInstance(){
        return INSTACE;
    }
}

优点:JVM保证线程安全。

缺点:不管是否有用到,类加载创建就创建实例,浪费资源。

1.2懒汉模式

方式1

java 复制代码
public class Singleton2 {
    private static volatile Singleton2 INSTACE;

    private Singleton2() {

    }

    public static Singleton2 getInstance(){
        //判定实例实例是否为空,避免频繁的取获取锁
        if(INSTACE == null){
            synchronized (Singleton2.class){
                if(INSTACE == null){
                    INSTACE = new Singleton2();
                }
            }
        }
        return INSTACE;
    }
}

volatile修饰原因:在多线程且发生指令重排序的情况下,可能会产生对象未被初始化完全就被返回,其他线程执行该段代码时,发现实例为非空,就会直接使用,可能会导致出现异常。

方式2

java 复制代码
public class Singleton3 {
    /**
     * 匿名内部类,外部类被加载,其内部类还不会被加载,等到内部类被使用时才会被加载,也就是调用getInstance方法的时候加载。
     */
    private static class Mgr03Holder{
        private final static Singleton3 INSTANCE = new Singleton3();
    }

    public static Singleton3 getInstance(){
        return Mgr03Holder.INSTANCE;
    }
}

方式3

java 复制代码
public enum Singleton4 {
    INSTANCE;
}

INSTANCE是一个枚举实例,枚举类的成员的实例指向该枚举类对象。

总结:日常开发中通常使用Spring的Bean工厂来帮我们产生单例。

相关推荐
阿闽ooo2 天前
中介者模式打造多人聊天室系统
c++·设计模式·中介者模式
小米4962 天前
js设计模式 --- 工厂模式
设计模式
逆境不可逃2 天前
【从零入门23种设计模式08】结构型之组合模式(含电商业务场景)
线性代数·算法·设计模式·职场和发展·矩阵·组合模式
驴儿响叮当20102 天前
设计模式之状态模式
设计模式·状态模式
电子科技圈2 天前
XMOS推动智能音频等媒体处理技术从嵌入式系统转向全新边缘计算
人工智能·mcu·物联网·设计模式·音视频·边缘计算·iot
徐先生 @_@|||2 天前
安装依赖三方exe/msi的软件设计模式
设计模式
希望_睿智3 天前
实战设计模式之访问者模式
c++·设计模式·架构
茶本无香3 天前
设计模式之十六:状态模式(State Pattern)详解 -优雅地管理对象状态,告别繁琐的条件判断
java·设计模式·状态模式
驴儿响叮当20103 天前
设计模式之备忘录模式
设计模式·备忘录模式
驴儿响叮当20103 天前
设计模式之迭代器模式
设计模式·迭代器模式