单例模式【Java版】

一、基本特点

      如何防止创建多个实例:构造方法设置为私有,使得外部无法直接new出实例

      基本组成:a)一个静态的和自身类型相同的成员对象

                      b)私有的构造方法

                      c)获取实例的公有方法,供外部调用,以返回实例

       

二、懒汉式

特点:类被加载时不创建实例,getInstance方法第一次被调用时才创建实例

类代码:

public class LazySingleton {

/**
* 静态的和自身类型相同的成员对象
*/
private static LazySingleton theLazySingleton=null;

/**
* 构造方法设置为私有,保证无法从外部new出实例
* LazySingleton myLazySingleton=new LazySingleton();这样的语句就无法通过编译
*/
private LazySingleton(){}

/**
* 供外部调用的获取实例的方法,会在第一次调用时初始化实例
*/
public static LazySingleton getInstance(){

if(theLazySingleton==null){
System.out.println("懒汉式单例,第一次调用,先创建,再返回实例!");
theLazySingleton=new LazySingleton();
}else{
System.out.println("懒汉式单例,已不是第一次调用,直接返回实例!");
}

return theLazySingleton;
}

}

主函数:

    public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("开始测试单例模式!");

//尽管使用了两个引用名,实际上指向的是内存中同一个实例
LazySingleton myLazySingleton_A, myLazySingleton_B;

myLazySingleton_A=LazySingleton.getInstance();
myLazySingleton_B=LazySingleton.getInstance();
}

运行结果:

    

三、饿汉式

特点:类被加载时就创建实例

类代码:

public class HungrySingleton {

private static final HungrySingleton theHungrySingleton=new HungrySingleton();

private HungrySingleton(){}

public static HungrySingleton getInstance(){

System.out.println("饿汉式单例,实例已在类加载时被创建,故可直接返回实例!");

return theHungrySingleton;
}

}

主函数:

    public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("开始测试单例模式!");

HungrySingleton myHungrySingleton=HungrySingleton.getInstance();
}

运行结果:

posted @ 2011-11-25 16:26  jeffkuang  阅读(104)  评论(0)    收藏  举报