java学习 第四章 设计模式——单例

1.    场景和问题

Java程序中,如何确保在运行期间,某个类只有一个实例。

2.     解决方案

方案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

}

}

方案2:以空间换时间;代码简洁;线程安全。

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.单例模式体现的一些思想

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;

}

 

4.单例模式的变形使用

//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);

}

//每调用一次就把num1

num++;

//如果num超过需要控制的总数,那么把num设置为1,开始循环重复使用

if(num>count){

num=1;

}

//3:如果找到了就直接使用

return a;

}

5.实例池:如何动态控制实例的数目;如何动态调度实例;需要算法去处理;自动化、智能化处理。

功能提供实例的运行环境;控制实例的生命周期;控制实例数目。

更多内容请点这里

 

posted on 2013-05-10 20:34  时空圣主  阅读(193)  评论(0)    收藏  举报

导航