顾名思意,单例模式便是指一个类只能创建一个实例的设计模式。
单例模式分为懒汉式和饿汉式。
懒汉式指的是在类加载时,并不创建这个类的实例,直到第一次调用获取实例的方法时才会创建实例。
饿汉式指的是在类加载时,就已经创建了该类的唯一实例
下面给出了两种单例的代码演示,并展示了两个单例的区别
import java.lang.reflect.Method;
/**
* 懒汉式单例
* @author Administrator
*
*/
class SingletonLazy
{
private static SingletonLazy SingletonLazy = null;
private SingletonLazy()
{
}
public static SingletonLazy getInstance()
{
if(null == SingletonLazy)
{
SingletonLazy = new SingletonLazy();
}
return SingletonLazy;
}
/**
* 检查是实例是否已被创建
*/
public static void checkInstanceIsNull()
{
if(null == SingletonLazy)
{
System.out.println(" 实例还未被创建");
}
else
{
System.out.println(" 实例已被创建");
}
}
}
/**
* 饿汉式单例
* @author Administrator
*
*/
class SingletonHungry
{
private static SingletonHungry singletonHungry = new SingletonHungry();;
private SingletonHungry(){}
public static SingletonHungry getInstance()
{
return singletonHungry;
}
/**
* 检查实例是否已被创建
*/
public static void checkInstanceIsNull()
{
if(null == singletonHungry)
{
System.out.println(" 实例还未被创建");
}
else
{
System.out.println(" 实例已被创建");
}
}
}
/**
* 测试类
* @author Administrator
*
*/
public class Test
{
public static void main(String[] args)
{
try {
System.out.println("懒汉式单例");
Class singletonLazyClass = Class.forName("SingletonLazy");
System.out.println("类装载后,未调用getInstance()方法");
Method methodcheckInstanceIsNull1 = singletonLazyClass.getMethod("checkInstanceIsNull",new Class[]{});
methodcheckInstanceIsNull1.invoke(SingletonLazy.class, null);
Method methodGetInstance1 = singletonLazyClass.getMethod("getInstance", new Class[]{});
System.out.println("类装载后,调用了getInstance()方法");
methodGetInstance1.invoke(SingletonLazy.class,null);
methodcheckInstanceIsNull1.invoke(SingletonLazy.class, null);
System.out.println("-------------------------------------");
System.out.println("饿汉式单例");
System.out.println("类装载后,未调用getInstance()方法");
Class singletonClass = Class.forName("SingletonLazy");
Method checkInstanceIsNull2 = singletonClass.getMethod("checkInstanceIsNull",new Class[]{});
checkInstanceIsNull2.invoke(SingletonLazy.class, null);
Method methodGetInstance2 = singletonClass.getMethod("getInstance", new Class[]{});
System.out.println("类装载后,调用了getInstance()方法");
methodGetInstance2.invoke(SingletonLazy.class,null);
checkInstanceIsNull2.invoke(SingletonLazy.class, null);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
屏幕打印结果如下:
懒汉式单例
类装载后,未调用getInstance()方法
实例还未被创建
类装载后,调用了getInstance()方法
实例已被创建
-------------------------------------
饿汉式单例
类装载后,未调用getInstance()方法
实例已被创建
类装载后,调用了getInstance()方法
实例已被创建