**单例(Singleton)模式:
定义**: 指一个类只有一个实例,该类能自行创建这个实例。
举例: Windows中只能打开一个任务管理器,防止打开多个造成资源的浪费或者各个窗口显示的内容不一致。
特点:
1.单例类只有一个实例对象;
2.该单例对象必需由单例类自行创建;
3.单例类对外提供一个访问该单例的全局访问点;
结构:
1.单例类: 包含一个实例且能自行创建这个实例的类;
2.访问类:使用单例的类;
分类:
1.饿汉式;
2.懒汉式;
饿汉式:
/*饿汉式(静态常量)*/
public class ehan1 {
public static void main(String[] args) {
Singleton instance1=Singleton.getInstance();
Singleton instance2=Singleton.getInstance();
/*以下几句是验证这两个instance是同一个实例*/
System.out.println(instance1==instance2); //true
System.out.println("instance1的hashCode="+instance1.hashCode());
System.out.println("instance2的hashCode="+instance2.hashCode());
}
}
class Singleton{
//1.构造器私有化,外部不能new了
private Singleton() {
}
//2.本类内部创建对象实例
//因为是静态的,所以类加载的时候就创建了
//外部不能new,但内部可以new
private final static Singleton instance=new Singleton();
//3.提供一个公用的静态方法,返回实例对象
public static Singleton getInstance() {
return instance;
}
}
输出:
顾名思义 饿汉 就是太饿了,等不及了,所以我们要在类创建的时候就创建好了了一个静态的对象的对象供系统使用,以后不再改变,所以是线程安全的,可以直接用于对多线程而不会出现问题,
因为在类创建的时候静态代码块就会被加载,所以我们也可以把new Singleton()放在静态代码块中,和上面的没有区别;
class Singleton{
//1.构造器私有化,外部不能new了
private Singleton() {
}
/*与饿汉式(静态常量不同的地方)*/
static {
instance=new Singleton();
}
private static Singleton instance;
//3.提供一个公用的静态方法,返回实例对象
public static Singleton getInstance() {
return instance;
}
}