1、什么是单例类:只允许创建一个对象实例的类,称为单例类
2、为什么要出现单例类:
2.1、频繁的创建对象、回收对象造成系统的开销问题(比如:多次的创建数据库连接对象:conn 用来打开关闭数据库,造成服务器开销大,可以改成创建一个数据库连接对象conn,直到不再需要操作数据库再把这个对象conn回收)
2.1、多次的创建对象对业务逻辑没有什么意义
3、把一个类定义为单例类注意原则:
3.1、把该类的构造器用private修饰符定义,把构造器隐藏起来,不让直接通过new该类的构造器来创建该类对象实例
3.1、根据良好封装的原则,一旦把该类的构造器封装起来,就需要创建一个public方法作为访问该类的入口,且该方法必须用static修饰符,因为该类构造器隐藏,调用该方法的时候不存在类的实例对象,只能用类来访问
3.3、该类必须能缓存已创建的对象,否则该类无法知道是否曾经创建过对象,也就无法保证只创建一个对象
3.4、因此需要创建一个成员变量来保存曾经创建的类对象,而且该成员变量还必须能被上面的静态方法访问,因此必须用static修饰符修饰
鉴于上面条件,创建一个单例类示例:
class Singleton{
//-使用一个类变量缓存曾经创建的类实例对象
private static Singleton instance;
//-对构造器用private修饰,隐藏起来,禁止直接new该类的构造器
private Singleton(){
}
//-提供一个public修饰的静态方法,作为该类的入口
//-作用是保证只产生一个类对象实例,并返回
public static Singleton getInstance(){
if(instance==null){
instance=new Singleton();
}
return instance;
}
}
public class SingletonTest{
public static void main(String[] args){
//-直接通过类访问其静态方法,获取其类的实例
Singleton s1=Singleton.getInstance();
//-再次通过类访问其静态方法,但获取的仍然是上次创建的类对象实例
Singleton s2=Singleton.getInstance();
//-因为获取到的是同一个类实例对象,所以 == 判断是相等的,返回true
System.out.println(s1==s2);
}
}