单例模式有3种创建的方式
饿汉式,饱汉式,内部类方式。
部分内容从www.watchmen.cn转载。
/**
* 单例模式
* 1.饿汉式这种方式加载类对象,我们称作:预先加载方式。(直接初始化实例的,线程安全)
* 2.懒汉式这种方式加载类对象,我们称作:延迟加载方式。(需要的时候才开始创建,线程不安全的(会出现实例对象不唯一的情况))
*/
/**
*饿汉模式
**/
public class Singleton {
//新建一个实例对象
private static Singleton single=new Singleton();
//私有的构造方法 保证实例只有自己内部可以实例化
private Singleton(){}
public static Singleton getInstaance()
{
return single;
}
//测试数据
public static void disp()
{
System.out.println("线程安全的单例调用成功!!");
}
}
/*
*饱汉模式
*/
public class SingletonSych {
private static SingletonSych singletonSych=null;
public synchronized static SingletonSych getInstance()
{
if(singletonSych==null)
{
singletonSych=new SingletonSych();
}
return singletonSych;
}
public void disp()
{
System.out.println("非线程安全的调用成功!!");
}
}
//内部类
public class Singleton {
private Singleton() {}
private static class SingletonHolder {
static final Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
}
内部类的方式:
确保线程安全的同时, 比上面创建静态实例域的办法还有一个好处就是:
SingletonHolder中可以使用静态方法替换静态域, 实现比较复杂的逻辑, 而不仅仅是new Singleton()这样简单地调用构造方法.