java学习 第四章 设计模式——单例
在Java程序中,如何确保在运行期间,某个类只有一个实例。
方案1:以时间换空间;代码复杂;线程不安全;体现延迟装载思想;
注:一般情况下内存是有限的,更宝贵,而时间慢点没关系;
public class A{
//5:用来保存自己的类实力
//6:强迫使用“static”
private static A a=null; (static:被迫使用)
//1:首先收回外部能够new A()的权限
private a(){
}
//2:主动给外部的调用提供自己的实例。
//3:
public static A getInstance(){
//4:想办法内部控制调用构造方法的次数(1次)
//7:只在第一次调用时new一个
if(a==null){
//8:
a=new A();
}
//9:
return a
}
}
static:仅加载一次(初始化一回),static共用一个内存空间。
静态变量仅初始化一次;装载没有并发之说。
方案2采用类装载的功能,类装载的功能是虚拟机的功能。
//5:
private static A a=new A();
//1:收回外部能够new A()的权限
private a(){}
//2:主动给外部调用提供自己的实例
//3
public static A getInstance(){
//4:想办法内部控制调用构造方法的次数(1次)
//6:直接返回
return a;
}
}
3.单例模式的本质:控制实例的数目。
4.1 延迟装载(Lazy Load):不得不用的时候才使用。
4.2 缓存:用空间换时间,将频繁使用的数据放在内存中进行处理。
Java中如何定义缓存:
//1:定义用来缓存数据的容器(一般来说是集合)
private static Map map=new HashMap();
public static A getInstance2(){
//1:到缓存里面查找需要使用的数据
A a=(A)map.get(“one”);
//2:如果找不到
if(a==null){
//2.1 就创建一个数据(或者获取一个数据)
a=new A();
//2.2 然后把新的数据设置回到缓存中
map.put(“one”,a);
}
//3:如果找到了就直接使用
return a;
}
//1:定义用来缓存数据的容器(一般来说是集合)
private static Map map=new HashMap();
//用来记录当前正在使用哪一个实例,初始化为1
private static int num=1;
//用来记录需要控制的实例的总数为3个
private static int count=3;
public static A getInstance2(){
//1:到缓存里面查找需要使用的数据
A a=(A)map.get(num);
//2:如果找不到
if(a==null){
//2.1 就创建一个数据(或者获取一个数据)
a=new A();
//2.2 然后把新的数据设置回到缓存中
map.put(num,a);
}
//每调用一次就把num加1
num++;
//如果num超过需要控制的总数,那么把num设置为1,开始循环重复使用
if(num>count){
num=1;
}
//3:如果找到了就直接使用
return a;
}
5.实例池:如何动态控制实例的数目;如何动态调度实例;需要算法去处理;自动化、智能化处理。
功能:提供实例的运行环境;控制实例的生命周期;控制实例数目。
更多内容请点这里
浙公网安备 33010602011771号