设计模式-单例模式的5种方式

设计模式-单例模式

1,什么是单例模式

单例模式是23种设计模式中最简单的一种设计模式

作用:可以保证JVM中同一个对象永远只有一个

单例模式要领:

  • 1,构造方法私有化
  • 2,对外提供一个公开的静态的返回当前类型对象的方法
  • 3,提供一个当前类型的私有静态变量

2,单例模式创建方式:

1.饿汉式:

  • 类初始化时,会立即加载该对象,线程天生安全,调用效率高。

2.懒汉式:

  • 类初始化时,不会初始化该对象,真正需要使用的时候才会创建该对象,具备懒加载功能。

3.静态内部方式:(推荐使用)

  • 结合了懒汉式和饿汉式各自的优点,真正需要对象的时候才会加载,加载类是线程安全的。

4.枚举单例:

  • 使用枚举实现单例模式 优点:实现简单、调用效率高,枚举本身就是单例,由jvm从根本上提供保障!避免通过反射和反序列化的漏洞, 缺点没有延迟加载。

5.双重检测锁方式

  • (因为JVM本质重排序的原因,可能会初始化多次,不推荐使用)

3,懒汉式单例模式

package com.example.javabasis.design_patterns.singleton;

/**
 * @description: 单例模式-懒汉式
 * @create: 2019-07-19 21:20
 * @author:
 **/
public class Singleton_01 {

    private static Singleton_01 singleton;

    private Singleton_01() {
    }

    /**
     * 使用方法同步代码块,双重判空检验。
     * 保证返回一个实例,同一时刻只运行一个线程访问getInstans 方法
     *
     * @return
     */
    public static Singleton_01 getInstans2() {
        if (singleton == null) {
            synchronized (Singleton_01.class) {
                if (singleton == null) {
                    singleton = new Singleton_01();
                }
            }
        }
        return singleton;
    }

}

4,饿汉式单例模式

package com.example.javabasis.design_patterns.singleton;

/**
 * @description: 饿汉式单例模式,不存在线程安全问题。
 * @create: 2019-07-19 21:36
 * @author:
 **/
public class Singleton_02 {

    private static Singleton_02 singleton = new Singleton_02();

    private Singleton_02() {}

    public static Singleton_02 getInstans(){
        return singleton;
    }

}

5,使用枚举实现单例模式

package com.example.javabasis.design_patterns.create_type.singleton;

/**
 * @description: 使用枚举类实现单例模式
 * @create: 2019-07-21 15:36
 * @author:
 */
public class EnumSingleton {

    private EnumSingleton() {
    }

    public static EnumSingleton getInstance() {
        return InnerEnum.INSTANCE.getInstance();
    }

    static enum InnerEnum {
        INSTANCE;
        private EnumSingleton enumSingleton;

        private InnerEnum() {
            this.enumSingleton = new EnumSingleton();
        }

        private EnumSingleton getInstance(){
            return this.enumSingleton;
        }
    }

}

6,使用静态内部类,实现单例模式(推荐使用)

package com.example.javabasis.design_patterns.create_type.singleton;

/**
 * @description:
 * @create: 2019-07-21 16:11
 * @author:
 */
public class Singleton_03 {

    private Singleton_03() {
        System.out.println("初始化..");
    }

    private static class SingletonClassInstance {
        private static final Singleton_03 SINGLETON_03 = new Singleton_03();
    }

    // 方法没有使用同步关键字
    public static Singleton_03 getInstance() {
        System.out.println("getInstance");
        return SingletonClassInstance.SINGLETON_03;
    }

    public static void main(String[] args) {
        Singleton_03 s1 = Singleton_03.getInstance();
        Singleton_03 s2 = Singleton_03.getInstance();
        Singleton_03 s3 = Singleton_03.getInstance();
        System.out.println(s1 == s2 && s2 == s3);
    }

}

7,测试类

package com.example.javabasis.design_patterns.create_type.singleton;

public class SingletonTest {

    public static void main(String[] args) {
        // 懒汉单例模式
        Singleton_01 instans1 = Singleton_01.getInstans();
        Singleton_01 instans2 = Singleton_01.getInstans();
        System.out.println(instans1 == instans2);

        // 饿汉单例模式
        Singleton_02 singleton01 = Singleton_02.getInstans();
        Singleton_02 singleton02 = Singleton_02.getInstans();
        System.out.println(singleton01 == singleton02);

        // 枚举单例模式
        EnumSingleton enumSingleton = EnumSingleton.getInstance();
        EnumSingleton enumSingleton2 = EnumSingleton.getInstance();
        System.out.println(enumSingleton == enumSingleton2);
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值