懂,但不完全懂的设计模式——单例模式

本文介绍了单例模式的概念及其应用场景,并详细探讨了多种实现方法,包括私有化构造方法、懒汉式构造、静态内部类及枚举等,帮助读者深入理解单例模式的设计原则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单例模式

1.介绍

​ 单例模式适用于一些特殊的类的创建,比如管理类、工厂类等;这些类的共同之处在于,他们仅需要一个对象即可完成所有相关工作,额外创建的对象也许没什么意义。但在实际的使用中,可能会为了方便,直接创建一个新对象,那么这是时候就需要通过一些代码手段将这个新对象转变为程序一开始就决定提供的那个对象

2.一些实现手段
私有化类的构造方法

​ 使得在其他类中创建该类对象时,无法使用new 操作符,而只能通过类的getInstance()方法。再对getInstance()方法进行重写,使其返回目标类中已经确定了的一个对象。

@一般手段

​ 此对象可以设定为公共静态常量,其不可改变,但是可以提供操作,比如工厂类的对象使用;这个常量在类加载时便初始化,或者使用静态语句块,两者效果是一样的
​ 【优点,简单且适用,线程安全;缺点:一旦类加载就会被创建实例】

//normal
public staic final Manager INSTANCE = new Manger();
privat Manager(){}
//static block
public static final Manager INSTANCE ;
static {
   INSTANCE = new Manager();
}
@懒汉构造方法

lazy loading:在getInstance()中创建对象
【优点:避免一般手段中的类加载创建】
【缺点:可能线程不安全】

public static final Manager INSTANE;
private Manager(){}
public static Manager getInstance(){
      if(INSTANCS == null)
         INSTANCE = new Maneger();
      return INSTANCE;
}
//解决办法 加锁 --新的问题,效率,时间,资源
public static synchronized Manager getInstance(){}

java lambda表达式:仅适用于只包含一个函数的内部类对象快速创建

@新的问题–加锁又提速

加锁的进步->双重校验 ,volatile

//其实这种还需要考虑指令重排 
 private static volatile Manager INSTANCE;//JIT
public static Manager getInstance(){
     if(INSTANCE == null){
         synchronized (Manager.class){
              if(INSTANCE == null)
                 INSTANCE == new Manager();
         }
     }
     return INSTANCE;
}
@完美-静态内部类写法

​ 如何实现:在单例的类F中写一个静态内部类holder,然后在holder中声明静态常量INSTANCE并赋值,然后在F的getInstance()中获取holder的INSTANCE即可。

private static class Holder{
   private final static Manager INSTANCE = new Manager();
}

public static Manager getIntance(){
     return Holder.INSTANCE;
}

​ 原理:一个静态内部类,在外部类被加载的时候不会被加载,故而holder在getInstance()调用时被加载;线程安全由JVM保证。

@极致完美

使用enum,线程安全,且可反序列化

public enum Manager{

    INSTANCE;
    
    public static void main(String[] args){
        //调用方式
         System.out.println(Manager.INSTANCE);
    }
 }
 以上就是单例模式的简单内容啦,有不对的地方可以评论区或者私信我进行纠正哦~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值