实现方式一:延迟加载
package singleton;
/**
* 单例模式(实现方式一)
* 特点:在调用方法的时候创建对象,这种是线程不安全的。
* 此种方式的应用:延迟加载
*
* @author liyulin
*
* @version 1.0 2013-9-6 下午7:13:44
*
*/
public class SingletonDemo1 {
// 4、用来保存自己的类实例
private static SingletonDemo1 singletonDemo = null;
// 1、收回外部能够new singletonDemo()的权限
private SingletonDemo1() {
}
// 2、主动给外部调用自己的实例
public static SingletonDemo1 getInstance() {
// 3、控制内部调用构造函数的次数
// 5、只在第一次调用的时候new一个
if (singletonDemo == null) {
singletonDemo = new SingletonDemo1();
}
return singletonDemo;
}
}实现方式二
package singleton;
/**
* 单例模式(实现方式二)
* 特点:在加载类的时候创建对象,这种是线程安全的。
*
* @author liyulin
*
* @version 1.0 2013-9-6 下午7:13:44
*
*/
public class SingletonDemo2 {
private static SingletonDemo2 singletonDemo2 = null;
// 3、控制外部调用构造方法的次数
static {
singletonDemo2 = new SingletonDemo2();
}
// 1、回收外部能够new SingletonDemo2()的权限
private SingletonDemo2() {
}
// 2、主动给外部提供自己的实例
public static SingletonDemo2 getInstance() {
return singletonDemo2;
}
}
缓存模拟;单例模式的变形:
package singleton;
import java.util.HashMap;
import java.util.Map;
/**
* 缓存模拟;单例模式的变形:三例
*
* @author liyulin
*
* @version 1.0 2013-9-6 下午7:42:30
*
*/
public class Cache {
// 1、定义缓存数据的容器
private static Map<Object, Object> map = new HashMap<Object, Object>();
private Cache() {
}
// 模拟缓存
public static Cache getCache() {
// 2、到缓存里面查找需要使用的数据
Cache cache = (Cache) map.get("data");
// 3、如果找不到
if (cache == null) {
// 3.1、就新建一个数据(或者获取一个数据)
cache = new Cache();
// 3.2、然后把新建的数据设置到缓存中
map.put("data", cache);
}
// 4、如果找到了就直接使用
return cache;
}
/*---------------------------------- 控制三个实例 ----------------------------------*/
// 用来记录当前正在使用哪一个实例,初始值为1
private static int num = 1;
// 实例的总个数为3个
private static int count = 3;
public static Cache getCache2() {
Cache cache = (Cache) map.get(num);
if (cache == null) {
cache = new Cache();
map.put(num, cache);
}
num++;
if(num > count){
num = 1;
}
return cache;
}
}
本文详细解析了单例模式的两种实现方式及其应用,并通过缓存模拟展示了单例模式的变形。深入探讨了线程安全、延迟加载等关键特性,适合对Java并发编程感兴趣的开发者学习。
2335

被折叠的 条评论
为什么被折叠?



