一、单例模式的特点
1、只能有一个实例;
2、只能本身调用本身,生成一个实例;
3、只能为其他对象提供这一个实例。
二、实现思想
定义一个实例的时候会调用构造方法,因此单例模式的思想也应从构造方法入手;
先定义一个主类和一个单例类:
public class SingleDemo
{
public static void main(String args[])
{
SingleTest test1 =
}
}
class SingleTest
{
public SingleTest()
{
}
}
上述方式中,可以定义多个实例,不符合;把SingleTest()构造方法的类型参数改成private,如下:
class SingleTest
{
private SingleTest()
{
}
}
则,在主类中一次都无法进行实例化了。解决办法:在SingleTest类中定义一个public的方法,用于调用构造函数,如下:
class SingleTest
{
private SingleTest()
{
}
public SingleTest getInstance()
{
return new SingleTest ();
}
}
修改后,若想调用getInstance()方法,则需先实例化,但目前用new SingleTest()的方式进行实例化明显不行,因此考虑用“类名称.方法名()”的方式,则getInstance()要定义成static类型,如下:
public class SingleDemo
{
public static void main(String args[])
{
SingleTest test1 = SingleTest.getInstance();
SingleTest test2 = SingleTest.getInstance();
}
}
class SingleTest
{
private SingleTest()
{
}
public static SingleTest getInstance()
{
return new SingleTest ();
}
}
结果:
但是,此种方式很明显可以产生多个实例化对象。因此,需要把getInstance()方法体中的返回参数修改成固定实例, 即首先实例化一个对象,再把此对象返回,就可以得到唯一的一个实例,如下:public class SingleDemo
{
public static void main(String args[])
{
SingleTest test1 = SingleTest.getInstance();
SingleTest test2 = SingleTest.getInstance();
}
}
class SingleTest
{
private static SingleTest st = new SingleTest ();
private SingleTest()
{
}
public static SingleTest getInstance()
{
return st;
}
}
结果: 可以看出,只能实例化一次。
注意: 由于st使用在getInstance()方法体中,因此定义为static类型;st最好定义为private类型的,public类型的也可以,但是不推荐。
或者,也可以这样写:
class SingleTest
{
private static SingleTest st;
private SingleTest()
{
}
public static SingleTest getInstance()
{
if(st == null)
{
st = new SingleTest();
}
return st;
}
}