记录一下刚才学的单例模式的知识。
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();
}
private static SingletonObject1 object;
为何要定义成static,因为getInstance()方法已经定义成了static,方法内部是不能调用 非static 的变量的。
返回实例的方法也有两种:
第一种:直接在定义时就生成一个,然后再getInstance()里返回该对象;
第二种:在定义时设置为null,在getInstance()里通过判断是否为null来生成或直接返回对象。
从目前的知识范围内来理解,这两种方法没有太大的区别。但老师说虽然目前会是这样,但在多线程环境下会出现不同,这些等到熟悉一下了之后再继续更新该日志吧~~~
最后,打印出了一些Log,测试了两种方法。先打印对象的地址,然后通过“==”来判断两个对象是否指向同一地址来确定是否相等。