Singleton就是只能创建一个实例对象,所以不能拥有public的构造方法。
public class Singleton
{
private Singleton(){}
}
既然构造方法是私有的,那么从外面不可能创建实例了,只能从内部创建并用一个方法来返回此实例。那么此方法必须是static的,这样在外部不能创建实例的情况下才能调用此方法获得实例。
public class Singleton{
private Singleton(){}
public static Singleton getInstance(){
return [Singleton Instance];
}
}
getInstance方法要返回一个Singleton实例,就需要一个Singleton类型的变量来存储。声明一个Singleton类型的属性,必须是static 的,因为静态方法只能访问静态属性。
public class Singleton{
private Singleton(){}
public static Singleton getInstance(){
single=new Singleton();
return single;
}
private static Singleton single;
}
这样就能获得Singleton的实例了,但并不能确保只生成一个实例,因此需做判断。
public class Singleton{
private Singleton(){}
public static Singleton getInstance(){
if(single==null){
single=new Singleton();
}
return single;
}
private static Singleton single;
}
上面的方法只能用于单线程环境,在多线程环境中需要通过同步来解决
public class Singleton{
private Singleton(){}
public synchronized static Singleton getInstance(){
if(single==null){
single=new Singleton();
}
return single;
}
private static Singleton single;
}
另一种实现方法是提前实例化
public class Singleton{
private static Singleton single=new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return single;
}
}
此时single的static修饰符有起到另一个作用:因为static类型的属性,只在类加载时初始化一次,以后不会再初始化了,确保了只有一个实例。