一篇文章了解什么是单例模式?并掌握五种创建方式!

今天介绍Java中常见的一种设计模式:单例模式

那么什么是单例模式呢?

单例模式(Singleton Pattern):单例模式是Java中最简单的设计模式之一。单例模式的目的是为了保证该类只有一个实例,这个实例由该类自己创建,并提供一个全局的访问点。访问单例模式的对象时可以直接访问不需要创建该对象的实例。

单例模式的注意点:

单例类只有一个实例
单例类的实例必须由它自己创建
单例类必须给其他对象提供统一的访问点

单例模式的优点:

1、在内存里只有一个实例从而减少了内存的开销,尤其是避免了频繁的创建与销毁对象
2、避免对资源的多重占用(比如写文件操作)

单例模式的缺点:

没有接口
不能继承
与单一职责原则冲突,一个类只应该关心内部逻辑而不关心外面怎样来实例化

单例模式的实现方式:

1. 懒汉模式:

懒汉模式的实现思想与懒加载有些相似,大致意思为:当有对象想要引用单例的实例时再去创建
懒汉模式的java代码实现:

public class SingletonDemo1 {
     
    //类初始化时,不初始化这个对象(延时加载,真正用的时候再创建)
    private static SingletonDemo1 instance;
     
    //构造器私有化
    private SingletonDemo1(){}
     
    //方法同步,调用效率低
    public static synchronized SingletonDemo1 getInstance(){
        if(instance==null){
            instance=new SingletonDemo1();
        }
        return instance;
    }
}	

2. 饿汉模式:

饿汉模式大致意思就是:在类加载的时候就去实例化对象,要用的时候直接返回回去

public class SingletonDemo1 { 
     private static SingletonDemo1 instance = new SingletonDemo1 ; 
     private SingletonDemo1 (){} 
     public static SingletonDemo1 getInstance(){  
          return instance;  
      } 
}
饿汉与懒汉的区别
饿汉模式懒汉模式
线程安全安全安全
调用效率
是否是延时加载

3. Double CheckLock实现单例:

DCL也就是双重锁判断机制,也可以理解为懒汉模式的升级版,但是由于JVM底层模型原因,偶尔会出问题,不建议使用:

public class SingletonDemo {
          private volatile static SingletonDemo SingletonDemo;
   
          private SingletonDemo() {
          }
   
          public static SingletonDemo newInstance() {
              if (SingletonDemo == null) {
                  synchronized (SingletonDemo.class) {
                     if (SingletonDemo == null) {
                         SingletonDemo = new SingletonDemo();
                     }
                 }
             }
             return SingletonDemo;
         }
     }

4. 静态内部类实现模式

此方式线程安全,调用效率高,可以延时加载

 public class SingletonDemo {
       
      private static class SingletonClassInstance{
          private static final SingletonDemo instance=new SingletonDemo();
      }
       
      private SingletonDemo(){}
       
      public static SingletonDemo getInstance(){
			return SingletonClassInstance.instance;
      }
      
 }

5. 枚举类

public enum SingletonDemo {
      
     //枚举元素本身就是单例
     INSTANCE;
      
     //添加自己需要的操作
     public void singletonOperation(){     
     }

如何选用:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值