TOP

设计模式之单例模式(一)
2017-10-10 12:34:33 】 浏览:7962
Tags:设计模式 单例 模式

                                        单例模式

  • 核心:保证一个类只有一个实例,并且提供一个访问该对象的全局访问点
  • 常见应用场景:
  1. Windows的任务管理器
  2. Windows的回收站
  3. 项目中,读取配置文件的类,一般也只有一个对象,没有必要酶促使用配置文件数据,每次new一个对象去读取
  4. .........
  • 优点:由于单例模式只生成一个实例, 减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置,产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后用永久驻留内存的方式来解决。单例模式可以在系统设置全局的访问点,优化共享资源访问,例如可以设计一个单例类,负责所有数据表的映射处理。
  • 常见的五种单例模式的实现方式:
    •  主要:
      •  饿汉式:线程安全,调用效率高,但是不能延时加载
      • 懒汉式:线程不安全,调用效率不高,但是可以延时加载
    • 其他:
      • 双重检测锁式:由于JVM底层内部模型和Java平台内存模型原因,偶尔会出问题,不建议使用
      • 静态内部类式:线程安全,调用效率高,可以延时加载
      • 枚举单例:线程安全,调用效率高,不能延时加载
  • 代码实现:
    • 饿汉式:

     public class SingletonDemo01 {
           private SingletonDemo01(){}     //将构造器私有
           private static SingletonDemo01 instance = new SingletonDemo01();
           //类加载的时候就将对象new出来,不管后面用不用
            public static SingletonDemo01 getInstance(){      //提供一个对外开放的方法用来获取对象
         return instance;
           }
     }
  •  饿汉式总结:由于类加载时是线程安全的,方法不需要同步,因为对象在类加载的时候就new出来了,以后也不能改变,所以没有延时加载的优势。
  • 懒汉式:

 
    public class SingletonDemo02 {
            private SingletonDemo02(){}     //将构造器私有
            private static SingletonDemo02 instance ;
            //类加载的时候,不初始化这个对象(延时加载,真正用到的时候再创建)
            public static   synchronized SingletonDemo02 getInstance(){   //提供一个对外开放的方法用来获取对象
                    //方法同步,调用效率低
            if (instance == null ){  //如果为null,创建对象
             instance = new SingletonDemo02();
                 }
                 return instance ;
           }
     }
  • 懒汉式总结:懒汉式适合单线程,多线程情况下如果在创建对象实例对象时不加上synchronized,则会导致对对象的访问不是线程安全的。懒汉式是延时加载,在需要的时候才创建对象。资源利用率高了,但每次调用getInstance()方法都需要同步,并发效率低
 
  • 双重检测锁式:

public class SingletonDemo03 {
           private SingletonDemo03(){}     //将构造器私有
           private static SingletonDemo03  instance ;
           //类加载的时候,不初始化这个对象(延时加载,真正
设计模式之单例模式(一) https://www.cppentry.com/bencandy.php?fid=97&id=131008

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇天南地北双飞客,老翅几回寒暑 下一篇java 企业网站源码 后台 springmv..