前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式(1)-单例设计模式

设计模式(1)-单例设计模式

作者头像
达达前端
发布2022-04-29 09:07:09
1210
发布2022-04-29 09:07:09
举报
文章被收录于专栏:达达前端

今天我们讲讲什么是单例设计模式,单例设计模式,(singleton):单例设计模式是最简单的设计模式,面试常考

单例设计模式

就是在某一个类中,在整个应用中,有且只有一个实例(对象),即是一个类中只有一个对象实例。在一般的开发中工具性地类,设计是为单例的。对于单例设计模式有N种写法。

单例模式一般写法:

代码语言:javascript
复制
public class Singleton{
private static final Singleton instance = new Singleton();
 //指向自己实例的私有静态引用
 //私有的构造方法
 private Singleton(){
 }
 public static Singleton getInstance(){
 //以自己为实例,返回值
  return instance;
 }
}

单例设计模式的优缺点:

优点:在单例设计模式中内存只有一个实例,减少了内存空间,特别是避免了一个对象需要频繁地创建,销毁对象,可以提高性能,单例设计模式只生成一个实例,大大提高了系统的性能,单例设计模式可以避免对资源的多重占用,比如我们在写一个文件操作,由于只有一个实例存在,避免了对同一个资源文件的同时操作。单例设计模式可以全局访问,设计一个单例类,负责所有的数据表映射处理。

缺点:对于单例设计模式的缺点,单例设计模式很容易导致程序内存泄漏,单例设计模式一般没有接口,扩展困难,若要进行扩展,只有修改代码。

单例设计模式

代码语言:javascript
复制
public class Singleton{
   private singleton(){}

   private static final Singleton instance = new Singleton();

   public static Singleton getInstance(){
        return instance;
   }

   public void sort(int[] arr){
       TODO
   }
   public int binarySearch(int[] arr,int key){
       TODO
   }
}

单例设计模式的特点:

步骤:

       1):私有化构造器;

       2):自身事先提供好一个对象(private static final);

       3):向外暴露一个公共的静态方法,用于返回该对象。

单例设计模式的饿汉单例写法

代码语言:javascript
复制
public class Singleton {  
   private static Singleton instance = new Singleton();  
    private Singleton (){
    }
    public static Singleton getInstance() {  
      return instance;  
    }  
}

单例设计模式的懒汉单例写法

代码语言:javascript
复制
public class Singleton {  
     private static Singleton instance;  
     private Singleton (){
     }
     public static synchronized Singleton getInstance() {  
       if (instance == null) {  
         instance = new Singleton();  
       }  
     return instance;  
     }  
}

饿汉式在类创建时就实例一个静态的对象交给自己使用,所以线程是安全的,但由于每次调用getInstance方法时都要进行同步,这是我们大部分不需要的操作。

DCL形式

代码语言:javascript
复制
public class Singleton {  
    private volatile static Singleton singleton;  
    private Singleton (){
      //TODO
    }   
    public static Singleton getSingleton() {  
    if (singleton == null) {  
        synchronized (Singleton.class) {  
        if (singleton == null) {  
            singleton = new Singleton();  
        }  
       }  
   }  
   return singleton;  
   }  
}

DCL这种写法对singleton进行了两次判空,如代码所示,第一次判断是为了不必要的同步,第二次是是否创建实例,在DCL形式中资源利用率高。

总结:

单例模式有很多种,但其原理就是将构造函数进行私有化,通过静态公有方法获取唯一实例。

如果觉得不错,可以分享哦,你的鼓励是我最大的进步!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-02-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档