zoukankan      html  css  js  c++  java
  • 单例模式

       设计模式相关知识在面试中经常被问到,其中的单例模式几乎是每次必问,同时还会要求手写单例模式的代码。至于为什么也不难理解,它的实现代码简短,用较短的时间就能完成,同时代码中也不乏一些细节可以考察面试者的基本功。简单啰嗦一下单例模式的基本知识,借用下网络搜索的结果:
          概念上可理解成一个类只有一个实例,实现上是要注意以下三点:
    1.       单例模式的类只提供私有的构造函数,
    2.       类定义中含有一个该类的静态私有对象,
    3.       该类提供了一个静态公有函数用于创建或获取它的静态私有对象
         理解好上面这几句话,即使面试的时候一时忘代码怎么写,也可以根据原理重新写出来的,理解原理要比记住代码更重要。用自己的话去描述给面试官听相信效果也是不错的,当然作为最后一关手写代码也很关键,在面试略有压力的情况,敢不敢保证写下的代码没有编译错误,真机测试一次通过。如果可以,那恭喜你面试暂时上岸,面试官要换题了。下面还是看两段代码吧。

    1. //懒汉式  
    2. public class SingletonA {  
    3.      public static SingletonA instance = null;  
    4.       
    5.      private SingletonA(){     }  
    6.       
    7.      public static SingletonA getSingletonA(){           
    8.           if(instance == null){  
    9.                instance = new SingletonA();  
    10.           }  
    11.           return instance;  
    12.      }      
    13. }  
    14.   
    15. //饿汉式  
    16. public class SingletonB {  
    17.      private static SingletonB instanceB = new SingletonB();  
    18.       
    19.      private SingletonB(){}  
    20.       
    21.      public static synchronized SingletonB getInstance(){  
    22.           return instanceB;  
    23.      }  
    24. }  
    25.   
    26. //双重锁定  
    27. public class SingletonC {  
    28.      private static SingletonC instance = null;  
    29.      private SingletonC(){};  
    30.       
    31.      public static SingletonC getInstance(){  
    32.           if(instance == null){  
    33.                synchronized (SingletonC.class) {  
    34.                     if(null == instance){  
    35.                          instance = new SingletonC();  
    36.                     }  
    37.                }  
    38.           }  
    39.           return instance;  
    40.      }  
    41. }  
           写了这么多,感觉是不是有点孔乙已了。好吧,其实面试官只是想知道下面几点
    1.        面试者是否了解单例,
    2.        是否知道懒汉式和饿汉式的区别
    3.        是不是还知道有双重锁定这么一回事,
    4.        是否会注意到饿汉式需要同步操作才好。
     
     
     
     
    下面简述:所谓“懒汉式”与“饿汉式”的区别,是在与建立单例对象的时间的不同。
    “懒汉式”是在你真正用到的时候才去建这个单例对象:
    比如:有个单例对象
    public class Singleton{ 
        private Singleton(){}
        private static Singleton singleton = null;  //不建立对象
        public static synchronized Singleton getInstance(){
                 if(singleton == null) {        //先判断是否为空
                     singleton = new Singleton ();  //懒汉式做法 
                 }
                 return singleton ;
         }
    
    }
     “饿汉式”是在不管你用的用不上,一开始就建立这个单例对象:比如:有个单例对象
    public class Singleton{ 
        public Singleton(){}
        private static Singleton singleton = new Singleton();  //建立对象
        public static Singleton getInstance(){
    
     return singleton ;//直接返回单例对象 }}

    它有以下几个要素:

    • 私有的构造方法
    • 指向自己实例的私有静态引用
    • 以自己实例为返回值的静态的公有的方法

     比较:
             饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变
              懒汉式如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的
              推荐使用第一种

    另外, 我的心愿是 世界 和平
  • 相关阅读:
    python学习笔记:遍历目录
    c++笔记:友元函数
    VMware Workstation 9: This virtual machine's policies are too old to be run by this version of VMware
    inet_ntoa内存问题
    python学习笔记:sqlite3查询
    python学习笔记:利用asyncore的端口映射(端口转发)
    编写谷歌浏览器的油猴脚本
    window编译7z
    通过配置nginx的header路由到不同环境的服务器
    用U盘给物理机安装ubuntu20.04
  • 原文地址:https://www.cnblogs.com/wangbinios/p/5014356.html
Copyright © 2011-2022 走看看