samtiger


QQ:418148757
Name:yangchuan
数据加载中……
设计模式之单例模式
    单例模式就是指整个应用中只能存在一个实例。单例类的创建有三种方式。就这三种方式可以作一个比较:

    第一种:在声明变量出实例化对象(也叫 饿汉式 单例模式)代码如下:
    
package com.zds.pattern.singleton;
/**
 * 
@author sam E-mail:ashan8888@163.com
 * 
@version 1.0
 
*/

public class SingletonA {
   
    
private static SingletonA singletonA = new SingletonA();
    
    
private SingletonA(){
        System.out.println(
"饿汉式");
    }

    
    
public static SingletonA getInstance(){
        
return singletonA;
    }
    
}

    
   第二种:把对象的创建放到方法里边去(也较 懒汉式 单例模式)代码如下:

package com.zds.pattern.singleton;

/**
 * 
@author sam E-mail:ashan8888@163.com
 * 
@version 1.0
 
*/

public class SingletonB {
    
private static SingletonB singletonB;

    
private SingletonB(){
        System.out.println(
"懒汉式");
    }

    
    
synchronized public static SingletonB getInstance() {

        
if (singletonB == null{
            singletonB 
= new SingletonB();
        }

        
return singletonB;
    }

}


第三种:另类懒汉式方式:代码如下:
package com.zds.pattern.singleton;
/**
 * 
@author sam E-mail:ashan8888@163.com
 * 
@version 1.0
 
*/

public class SingletonC {
     
static   class  SingletonHolder   {   
         
static  SingletonC instance  =   new  SingletonC();
      }
    
      
     
private SingletonC(){
         System.out.println(
"另类懒汉式");
     }

       
public   static  SingletonC getInstance()   {   
         
return  SingletonHolder.instance;   
      }
  
}



他们之间有什么有缺点呢?? 先来看第一种方式:懒汉式
    优点:在初始化的时候创建对象,调用getInstance的时候,没有同步方法,性能较高。
    缺点:可能导致数据还未初始完就创建了对象,故有可能对象数据初始不正确。
    上边第一段代码例子太简单了,看不成任何问题,那么来写一个可能产生问题的例子看看:代码如下:

 

package com.zds.pattern.singleton;

/**
 * 
@author sam E-mail:ashan8888@163.com
 * 
@version 1.0
 
*/

public class SingletonAa {
    
private static SingletonAa singletonAa = new SingletonAa();

    
public static String name = "sam";

    
public static String password;
    
static {
        password 
= "tiger";
    }

    
    
private SingletonAa(){
        
if(name.equals("sam")) System.out.println("name is ok");
        
if(password.equals("tiger")) System.out.println(" password is ok");
    }


    
public static SingletonAa getInstance() {
        
return singletonAa;
    }

}

 

  写到这个地方,是不是能看出点眉目了,呵呵,上边代码是不是会抛出:java.lang.NullPointerException异常,为什么呢,很简单,我们知道

类的加载过程是什么: 装载----验证 ---准备---解析---初始化。初始化之前,类加载器会把所有变量都默认为对应类型的默认值。复合类型变量是不是为null,而在初始的时候,上边的第一条语句就new了本身,在进入构造器函数的时候,是不是就产生了错误。

  第二种创建方式的优缺点:
   优点:避免了第一种方式可能产生的错误。
   缺点:不利于用在多线程上,因为他使用了锁,这样在资源上有很大浪费。
   后来有人提出了双检查单例模式,参考资料在:http://www.ibm.com/developerworks/java/library/j-dcl.html?dwzone=java 

第三种创建方式的优缺点:(Bob lee创建的)
   优点: 综合了上诉两种方法的优点,故,我比较推荐使用这种方式;


posted on 2007-12-21 15:03 sam.chuan.yang 阅读(1745) 评论(2)  编辑  收藏 所属分类: 23设计模式的理解

评论

# re: 设计模式之单例模式 2007-12-21 16:34 tbs005

先来占个沙发
  回复  更多评论    

# re: 设计模式之单例模式[未登录] 2013-08-29 17:17 oscar

wole asd a
  回复  更多评论    

只有注册用户登录后才能发表评论。


网站导航: