单例设计模式小白逐步分析

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("不是同一个对象");
					
			}	
	}
}

结果为:是同一个对象

              是同一个对象

猜你喜欢

转载自blog.csdn.net/zaoanmiao/article/details/80710368