前几天在面试的时候,让面试人员在纸上写单例模式,没有一个人写出来。碰巧今天徒弟问我单例的问题,就有了此文。
原因1:现在的孩子太浮躁了,从来没有在纸上写过代码。
原因2:确实在电脑写过,学习的时候写过,后来不用就给忘记了。
单例:经典的设计模式之一,面试的时候最经常被问到。单例,顾名思义:实例唯一。
上码:
package singleton;
/**
* @说明: 单例模式测试,包括:懒汉模式和饿汉模式
* @作者: JavaAlpha
* @日期: 2016年1月22日下午3:19:13
* @版本: V1.0
*/
public class SingletonTest {
private String name;
/**
* @param name The name to set.
*/
public void setName(String name) {
this.name = name;
System.out.println("My Name is " + this.name);
}
/**
* Singleton通过将构造方法限定为private避免了类在外部被实例化,
* 在同一个虚拟机范围内,Singleton的唯一实例只能通过getInstance()方法访问。
*/
private SingletonTest(){}
private static SingletonTest singletonTest = null;
/**
* 静态工厂方法
* 懒汉式单例类.在第一次调用的时候实例化自己
* @return
*/
public static SingletonTest getSingleton() {
if (null == singletonTest) {
singletonTest = new SingletonTest();
}
return singletonTest;
}
/**
* 饿汉式单例类.在类初始化时,已经自行实例化
* 饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生是线程安全的。
*/
private static SingletonTest singletonTest2 = new SingletonTest();
public static SingletonTest getSingleton2() {
return singletonTest2;
}
}
//特别注意:事实上,通过Java反射机制是能够实例化构造方法为private的类的,那基本上会使所有的Java单例实现失效。此问题在此处不做讨论,姑且掩耳盗铃地认为反射机制不存在。
测试类:
package singleton;
/**
* @说明: 测试类
* @作者: JavaAlpha
* @日期: 2016年1月22日下午3:32:45
* @版本: V1.0
*/
public class SingletonTestMain {
/**
* 主测试方法
* @param args
*/
public static void main(String[] args) {
SingletonTest st1 = SingletonTest.getSingleton();
st1.setName("张三");
SingletonTest st2 = SingletonTest.getSingleton();
st2.setName("李四");
if (st1 == st2) {
System.out.println("是同一个实例");
}else {
System.out.println("不是同一个实例");
}
}
}