1、
package com.test.singleinstance;
class SingleInstance{
}
public class SingleInstanceTest {
public static void main(String[] args) {
// 如果可以使用外部类new的方式new对象,则构造方法一定是public的
// 这样外部类就可以无限次的new新对象,不满足单例设计的要求
SingleInstance s1 = new SingleInstance();
SingleInstance s2 = new SingleInstance();
if(s1 == s2) {
System.out.println("是同一个对象");
} else {
System.out.println("不是同一个对象");
}
}
}
结果为:不是同一个对象
2、
package com.test.singleinstance;
class SingleInstance{
// 单例的前提是将构造方法私有化
private SingleInstance() {
}
// 如果期望外部类调用此方法获得本类对象且此方法不是static的话,
// 则外部类需要new一个新的对象然后去调用此方法,但与本类的构造方法为private相冲突
// 所以此方法必须为static方法
public static SingleInstance getSingleInstance() {
return new SingleInstance();
}
}
public class SingleInstanceTest {
public static void main(String[] args) {
SingleInstance s1 = SingleInstance.getSingleInstance();
SingleInstance s2 = SingleInstance.getSingleInstance();
if(s1 == s2) {
System.out.println("是同一个对象");
} else {
System.out.println("不是同一个对象");
}
}
}
结果为:不是同一个对象
3、//饿汉模式
class SingleInstance{
// 在全局new一个对象
private static SingleInstance singleInstance = new SingleInstance();
private SingleInstance() {
}
//无论如何调用本方法,都返回的是同一个全局对象
public static SingleInstance getSingleInstance() {
return singleInstance;
}
}
// 懒汉模式
class SingleInstance2{
// 注意此处变量为null
private static SingleInstance2 singleInstance = null;
private SingleInstance2() {
}
public static SingleInstance2 getSingleInstance() {
// 如果本类的对象不存在,在进行new对象,如果存在,就不进行次操作,如此便保证了对象的单例
if(singleInstance != null) {
singleInstance = new SingleInstance2();
}
return singleInstance;
}
}
public class SingleInstanceTest {
public static void main(String[] args) {
// 饿汉模式测试
SingleInstance s1 = SingleInstance.getSingleInstance();
SingleInstance s2 = SingleInstance.getSingleInstance();
if(s1 == s2) {
System.out.println("是同一个对象");
} else {
System.out.println("不是同一个对象");
}
// 懒汉模式测试
SingleInstance2 s3 = SingleInstance2.getSingleInstance();
SingleInstance2 s4 = SingleInstance2.getSingleInstance();
if(s3 == s4) {
System.out.println("是同一个对象");
} else {
System.out.println("不是同一个对象");
}
}
}
结果为:是同一个对象 是同一个对象