单例模式(Singleton)

记录一下刚才学的单例模式的知识。


public class SingletonTestMain {
	
	public static void main(String[] args){
		
		// 测试第一种方式
		SingletonObject obj1 = SingletonObject.getInstance();
		SingletonObject obj2 = SingletonObject.getInstance();
		
		System.out.println("obj1: " + obj1);
		System.out.println("obj2: " + obj2);
		System.out.println("obj1 equals obj2? " + (obj1==obj2));
		
		
		// 测试第二种方式
		SingletonObject1 obj3 = SingletonObject1.getInstance();
		SingletonObject1 obj4 = SingletonObject1.getInstance();
		
		System.out.println("\nobj3: " + obj3);
		System.out.println("obj4: " + obj4);
		System.out.println("obj3 equals obj4? " + (obj3==obj4));
		
	}
	
}




/**
 * 第一种实现单例模式
 * @author jingy
 *
 */
class SingletonObject{
	
	private static SingletonObject object = new SingletonObject();
	
	
	private SingletonObject(){
		// TO-DO nothing
	}
	
	public static SingletonObject getInstance(){
		return object;
	}
	
}


/**
 * 第二种方式实现单例模式
 * 
 **/
class SingletonObject1{
	
	private static SingletonObject1 object = null;
	
	private SingletonObject1(){
		// TO-DO nothing
		
	}
	
	
	public static SingletonObject1 getInstance(){
		
		if(null==object){
			object = new SingletonObject1();
		}
		return object;
	}
}

输出:

obj1: SingletonObject@1fb8ee3
obj2: SingletonObject@1fb8ee3
obj1 equals obj2? true

obj3: SingletonObject1@14318bb
obj4: SingletonObject1@14318bb
obj3 equals obj4? true



简单的分析一下,单例模式Singleton,用于只要求存在一个对象的情况。按照以前通用的类定义方法,构造函数是public访问限制的,是可以在声明变量的时候直接new出来的,但这种情况就不是单例模式了,因为可以new出千千万万个对象。所以这时我们需要把构造函数定义为private访问限制,即只能通过类自己来生成对象

既然构造方法对外界隐藏了,就必须要有一个对外暴露的方法来返回该对象的一个实例,即getInstance()方法。因为该类已经无法通过外界直接生成对象了,所以该方法就要定义为static静态的了。需要注意的是,getInstance()方法不能写成

	public static SingletonObject getInstance(){
		return new SingletonObject();
	}


因为只要调用一次getInstance()方法,就会生成一个新的对象,违背了单例模式的原则。这时就需要一个内部的变量来辅助了,

	private static SingletonObject1 object;

为何要定义成static,因为getInstance()方法已经定义成了static,方法内部是不能调用 非static 的变量的。


返回实例的方法也有两种:

第一种:直接在定义时就生成一个,然后再getInstance()里返回该对象;

第二种:在定义时设置为null,在getInstance()里通过判断是否为null来生成或直接返回对象。

从目前的知识范围内来理解,这两种方法没有太大的区别。但老师说虽然目前会是这样,但在多线程环境下会出现不同,这些等到熟悉一下了之后再继续更新该日志吧~~~


最后,打印出了一些Log,测试了两种方法。先打印对象的地址,然后通过“==”来判断两个对象是否指向同一地址来确定是否相等。


你可能感兴趣的:(多线程,String,object,测试,null,equals)