单例设计模式

一、概念

单例设计模式,就是指采取一定的方法,保证在整个软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。比如Properties,这个类用于加载配置信息,我们只需要有一个这个类的实例即可,就可以用上单例设计模式

二、实现
  1. 如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必须将类的构造器的访问权限设置为私有(private),这样,就不能在类外部使用构造器实例化类的对象,但类的内部仍然可以产生类的对象。
  2. 在类的内部提供一个公有的方法返回一个类的对象,由于外部不能通过构造器实例化对象,所以这个公有的方法必须是静态的,那么给静态方法调用的那个对象,也要设置为静态的
2.1 饿汉式
/**
 * @ClassName: Single
 * @Author: fang
 * @CreateTime:
 * @Description: 单例设计模式 - 饿汉式
 */
public class Single {
    //私有的构造器
    private Single() {

    }

    //类的内部实例化对象
    private static Single single = new Single();

    //提供一个公有的方法,返回内部对象
    public static Single getInstance() {
        return single;
    }
}

饿汉式中,静态的实例会随着类的加载而加载,很多时候可能你还不需要使用到这个实例,但是这个实例已经提前在内存中加载好,会占用一定的内存空间

2.2 懒汉式
/**
 * @ClassName: Single
 * @Author: fang
 * @CreateTime:
 * @Description: 单例设计模式 - 懒汉式
 */
public class Single {
    //私有的构造器
    private Single() {

    }

    //类的内部声明对象
    private static Single single;

    //提供一个公有的方法,返回内部对象
    public static Single getInstance() {
        /*判断 single 对象是否已经实例化
        * 若未实例化,则进行实例化后返回对象
        * 若已经实例化,则直接返回对象*/
        if (single == null) {
            single = new Single();
        }
        return single;
    }
}

懒汉式中,对象只先声明,不进行实例化,在用户调用getInstance()方法时,在来判断对象是否存在,不存在就实例化,存在则直接返回

懒汉式存在线程安全问题,如果多个线程同时调用了getInstance()方法,可能就会出现产生多个对象的情况

2.3 双重锁模式
/**
 * @ClassName: Single
 * @Author: fang
 * @CreateTime:
 * @Description: 双重锁模式
 */
public class Single {
    //私有的构造器
    private Single() {

    }

    //类的内部声明对象
    private static Single single;

    //提供一个公有的方法,返回内部对象,方法加上锁,确保不会出现线程安全的问题
    public static synchronized Single getInstance() {
        if (single == null) {
            //在创建对象的时候也加上锁,确保不会因为反射等原因出现线程安全的问题
            synchronized (Single.class) {
                single = new Single();
            }
        }
        return single;
    }
}

双重锁模式在方法和创建对象的操作上上锁,可以解决懒汉式线程不安全的问题

2.4 内部类实现单例设计模式
/**
 * @ClassName: Single
 * @Author: fang
 * @CreateTime:
 * @Description: 内部类实现单例设计模式
 */
public class Single {
    //私有的构造器
    private Single() {

    }

    //内部类可以调用外部类私有的构造方法,所以可以在内部类中实例化外部类的对象
    private static class InnerSingle {
        private static Single single = new Single();
    }

    //提供一个公有的方法,返回对象
    public static synchronized Single getInstance() {
        return InnerSingle.single;
    }
}

2.5 枚举实现单例设计模式
/**
 * @EnumName: Single
 * @Author: fang
 * @CreateTime: 
 * @Description: 枚举实现单例设计模式
 */
public enum Single {
    SINGLE
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值