对初学者而言,单例设计模式掌握2种即可(饿汉和懒汉模式)
public class DanLiMoShi {
public static void main(String[] args) {
A ss = A.getInstance();
A s = A.getInstance();
ss.show();
s.show();
System.out.println("s 的哈希code: "+s.hashCode());
System.out.println("ss的哈希code: "+ss.hashCode());
System.out.println("s 的identityHashCode: "+System.identityHashCode(s));
System.out.println("ss的identityHashCode: "+System.identityHashCode(ss));
//饿汉单例的哈希code输出的结果都是一样的,说明创建的对象确实是同一个
System.out.println("------------------饿汉懒汉分界线---------------------------");
B b = B.getInstance();
B bb = B.getInstance();
b.show();
bb.show();
System.out.println("b 的哈希code: "+b.hashCode());
System.out.println("bb的哈希code: "+bb.hashCode());
System.out.println("b 的identityHashCode: "+System.identityHashCode(b));
System.out.println("bb的identityHashCode: "+System.identityHashCode(bb));
//懒汉单例的Hashcode输出的结果都是一样的,说明创建的对象确实是同一个
//顺便复习了一下Hashcode和identityHashCode
//hashCode方法可以被重写并返回重写后的值,
//identityHashCode会返回对象的hash值而不管对象是否重写了hashCode方法。
}
}
class A{
//饿汉单例模式(线程安全)
private A() {} //1)将构造器私有化
private static A a = new A(); //2)新创建一个私有的、静态的 该类类型的实例
public static A getInstance() { //3)声明一个公共的、静态的get方法,return该实例
return a;
}
void show(){
System.out.println("饿汉单例测试");
}
}
class B{
//懒汉单例模式(线程不安全)
private B() {}; //1)将构造器私有化
private static B b;//此时b==null //2)定义一个私有的、静态的 该类类型的实例
public static B getInstance() { //3)声明一个公共的、静态的get方法,return该实例(return之前需要判断该实例是否是为null)
if(b==null) {
b=new B();
}
return b;
}
void show() {
System.out.println("懒汉单例模式");
}
}