A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 池中月 中级黑马   /  2015-7-3 19:53  /  539 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

单例模式

  单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

1、为什么要保证对象唯一性:  

  • 为了避免其他程序过多建立该类对象。先禁止其他程序建立该类对象
  • 还为了让其他程序可以访问到该类对象,只好在本类中,自定义一个对象。
  • 为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式。

2、软件设计思路:

  • 将构造函数私有化,防止调用者随意创建对象;
  • 在类中创建一个本类对象。
  • 提供一个方法可以获取到该对象。

3、单例模式根据定义形式,分为两类:

  饿汉式:

    类一进内存,就已经创建好了对象


  1. //饿汉式
  2. class SingleCase{
  3.         private SingleCase(){}
  4.         private static  SingleCase sc = new SingleCase();
  5.         public static SingleCase getCase(){
  6.                
  7.                 return sc;
  8.         }
  9.        

  10. }
复制代码

     懒汉式:

    类进内存,对象还没有存在,只有调用了getInstance方法时,才建立对象

  1. //懒汉式

  2. class SingleCase2{
  3.         private SingleCase2(){}
  4.         private static SingleCase2 sc = null;
  5.         public static SingleCase2 getCase(){
  6.                
  7.                 if(sc == null){
  8.                         sc = new SingleCase2();
  9.                 }
  10.                 return sc;
  11.         }
  12. }

复制代码

4、开发中单例模式的使用

  在软件开发中,由于懒汉式在多线程程序中易出错,所以建议使用饿汉式。


问题发生点:

  1. {
  2.                
  3.                 if(sc == null){
复制代码
分析:例如有A、B两个线程,当A先进入if语句但还没有实例化sc对象;如果这时B线程,因为sc=null,所以B线程同样可以进入if语句块中;这样导致A、B分别实例化了一次对象,造成单例错误。






1 个回复

倒序浏览
学习了。是不是还有一个双利设计模式啊?我一直搞不清什么是单例设计模式。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马