分享

5.3.10 思考单例模式

 静听沙漏 2012-03-01

5.3.10 思考单例模式

1、单例模式的本质

单例模式的本质:控制实例数目。

单例模式是为了控制在运行期间,某些类的实例数目只能有一个。可能有人就会思考,能不能控制实例数目为2个,3个,或者是任意多个呢?目的都是一样的,节约资源啊,有些时候单个实例不能满足实际的需要,会忙不过来,根据测算,3个实例刚刚好。也就是说,现在要控制实例数目为3个,怎么办呢?

其实思路很简单,就是利用上面通过Map来缓存实现单例的示例,进行变形,一个Map可以缓存任意多个实例。新的问题是,Map中有多个实例,但是客户端调用的时候,到底返回哪一个实例呢,也就是实例的调度问题,我们只是想来展示设计模式,对于调度算法就不去深究了,做个最简单的循环返回就好可以了。示例代码如下:

  1. /**
  2. * 简单演示如何扩展单例模式,控制实例数目为3个
  3. */
  4. public class OneExtend {
  5. /**
  6. * 定义一个缺省的key值的前缀
  7. */
  8. private final static String DEFAULT_PREKEY = "Cache";
  9. /**
  10. * 缓存实例的容器
  11. */
  12. private static Map<String,OneExtend> map =
  13. new HashMap<String,OneExtend>();
  14. /**
  15. * 用来记录当前正在使用第几个实例,到了控制的最大数目,就返回从1开始
  16. */
  17. private static int num = 1;
  18. /**
  19. * 定义控制实例的最大数目
  20. */
  21. private final static int NUM_MAX = 3;
  22. private OneExtend(){}
  23. public static OneExtend getInstance(){
  24. String key = DEFAULT_PREKEY+num;
  25. OneExtend oneExtend = map.get(key);
  26. if(oneExtend==null){
  27. oneExtend = new OneExtend();
  28. map.put(key, oneExtend);
  29. }
  30. //把当前实例的序号加1
  31. num++;
  32. if(num > NUM_MAX){
  33. //如果实例的序号已经达到最大数目了,那就重复从1开始获取
  34. num = 1;
  35. }
  36. return oneExtend;
  37. }
  38. public static void main(String[] args) {
  39. OneExtend t1 = getInstance ();
  40. OneExtend t2 = getInstance ();
  41. OneExtend t3 = getInstance ();
  42. OneExtend t4 = getInstance ();
  43. OneExtend t5 = getInstance ();
  44. OneExtend t6 = getInstance ();
  45. System.out.println("t1=="+t1);
  46. System.out.println("t2=="+t2);
  47. System.out.println("t3=="+t3);
  48. System.out.println("t4=="+t4);
  49. System.out.println("t5=="+t5);
  50. System.out.println("t6=="+t6);
  51. }
  52. }

测试一下,看看结果,如下:

  1. t1==cn.javass.dp.singleton.example9.OneExtend@6b97fd
  2. t2==cn.javass.dp.singleton.example9.OneExtend@1c78e57
  3. t3==cn.javass.dp.singleton.example9.OneExtend@5224ee
  4. t4==cn.javass.dp.singleton.example9.OneExtend@6b97fd
  5. t5==cn.javass.dp.singleton.example9.OneExtend@1c78e57
  6. t6==cn.javass.dp.singleton.example9.OneExtend@5224ee

第一个实例和第四个相同,第二个与第五个相同,第三个与第六个相同。也就是说一共只有三个实例,而且调度算法是从第一个依次取到第三个,然后回来继续从第一个开始取到第三个。

当然在这里我们不去考虑复杂的调度情况,也不去考虑何时应该创建新实例的问题。

2、何时选用单例模式

建议在如下情况时,选用单例模式。

当需要控制一个类的实例只能有一个,而且客户只能从一个全局访问点访问它时,可以选用单例模式,这些功能恰好是单例模式要解决的问题。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多