zoukankan      html  css  js  c++  java
  • 设计模式(1)-单例设计模式

    关注我,每天都有优质技术文章推送,工作,学习累了的时候放松一下自己。 
    本篇文章同步微信公众号 

    欢迎大家关注我的微信公众号:「醉翁猫咪」 



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


    单例设计模式


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


    单例模式一般写法:



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

    单例设计模式的优缺点:


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


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


    单例设计模式


    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):向外暴露一个公共的静态方法,用于返回该对象。


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


    public class Singleton {  
       private static Singleton instance = new Singleton();  
        private Singleton (){
        }
        public static Singleton getInstance() {  
          return instance;  
        }  
    }

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

    public class Singleton {  
         private static Singleton instance;  
         private Singleton (){
         }
         public static synchronized Singleton getInstance() {  
           if (instance == null) {  
             instance = new Singleton();  
           }  
         return instance;  
         }  
    }

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


    DCL形式


    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形式中资源利用率高。


    总结:


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


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


    从入门到熟悉!

    坚决不放弃!



  • 相关阅读:
    五险一金
    mysql支持批量备份表的存储过程
    支持批量执行的mysql存储过程
    Json数组转表格
    linux 基础知识
    如何处理win2008报错—IIS服务器500
    快照劫持的原理与JS跳转的分析
    如何在Win2008+IIS7环境下设置404状态默认错误页?
    如何在Win2008+IIS7环境下设置301特定目录站内跳转?
    CPU温度过高,小设置降温处理
  • 原文地址:https://www.cnblogs.com/dashucoding/p/11932732.html
Copyright © 2011-2022 走看看