面试官:了解设计模式吗?
应聘者:知道一些,有单例模式,工厂模式....
面试官:实现个单例模式。
应聘者:public class Singleton{...}(网上有很多示例代码,死记硬背)
面试官:什么场合会用单例模式?
应聘者:囧...(不知道啊)
以上其实是个人的一些经历啦
对于设计模式,让人很有种滥竽充数的感觉,感觉背一些名词,记一些示例代码就跟大师似的了,其实死记硬背什么都不是。
单例模式本身也有多种实现方式:
1、饿汉式(这翻译很搞,其实也很有道理,饿汉嘛,希望一来就有,所以初始化就实例化,我是这么理解的)
package ghjf.test;
/**
* <p>
* Title: 饿汉单例模式
* </p>
*
* <p>
* Description:饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变
* </p>
*
* <p>
* Copyright: http://blog.csdn.net/guihaijinfen
* </p>
*
* @author guihaijinfen
*
* @since:2012-12-17 下午06:45:20
*
*/
public class HungryManSingleton {
/**
* 初始化时自行实例化
*/
private static final HungryManSingleton hungryManSingleton = new HungryManSingleton();
/**
* 私有构造方法
*/
private HungryManSingleton() {
}
/**
*
* @Description:公用静态方法,对外提供唯一的实例
* @return hungryManSingleton
* @author guihaijinfen
* @since:2012-12-17 下午06:50:08
*/
public static HungryManSingleton getInstance() {
return hungryManSingleton;
}
}
2、懒汉式(这就更好理解了,懒汉应该理解为懒加载,也就是延迟加载,注意啊,这个存在线程问题)
package ghjf.test;
/**
* <p>
* Title:懒汉单例模式
* </p>
*
* <p>
* Description:懒汉式如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的
* </p>
*
* <p>
* Copyright: http://blog.csdn.net/guihaijinfen
* </p>
*
* @author guihaijinfen
*
* @since:2012-12-17 下午06:58:43
*
*/
public class LazyManSingleton {
/**
* 初始化时默认为null
*/
private static LazyManSingleton lazyManSingleton = null;
/**
* 私有构造方法
*/
private LazyManSingleton() {
}
/**
*
* @Description:延迟加载,紧第一次用时实例化,考虑线程安全
* @return
* @author guihaijinfen
* @since:2012-12-17 下午07:02:48
*/
public static synchronized LazyManSingleton getInstance() {
if (lazyManSingleton == null) {
lazyManSingleton = new LazyManSingleton();
}
return lazyManSingleton;
}
}
3、在网上看到的方法,采用内部类进行实例化的写法
package ghjf.test;
/**
*
* <p>
* Title: 单例
* </p>
*
* <p>
* Description: 网上的例子,据说是spring里的写法
* </p>
*
* <p>
* Copyright: http://blog.csdn.net/guihaijinfen
* </p>
*
* @author guihaijinfen
*
* @since:2012-12-17 下午07:09:49
*
*/
public class Singleton {
private Singleton() {
}
private static class SingletonHolder {
static Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
}
什么时候用单例模式呢?
整个应用环境中只需要同一个实例,就用单例。最常见的就是数据库连接池的设计。