缓存应用:单例模式在缓存机制中的应用
单例模式:顾名思义,一个系统中中定义的某类只有一个实例。
缓存应用:将要用到的资源提前从数据库或其他地方下载到内存,提高系统反应速度,增强用户体验满意度。
本例子来自于一个真实的项目,作者巧妙地将单例模式应用于缓存机制中。阅读本文,对单例模式,缓存机制都可以有进一步的认识和把握。
背景:
JavaME 中绘制本地图片太频繁,同一图片不同地方绘制,每次都要下载图片,每次都要新建对象。
解决方案:
缓存应用:加载程序时,将所有有可能画的本地图片全部下载到缓存,需要绘制的时候直接从缓存中读取.由于缓存器被设置为登记式缓存,即使以后有新图片加入本地资源,也无须更改原有代码,直接在新增功能程序里调用缓存即可。
具体实现:采用单例的设计模式来实现缓存应用。原因:缓存控制器整个系统中只需要一个即可。
源代码:
ImageBean.Java(封装下载的图片的 Javabean)
package com.xxx.bean;
02./**
03. * 文件名:ImageBean.java
04. *
05. * 版本信息:
06. * 日期:2009-10-21
07. * Copyright xxx Corporation 2009
08. * 版权所有
09. *
10. */
11./**
12. *
13. * 项目名称:Test
14. * 类名称:ImageBean
15. * 类描述:封装下载的图片的 Javabean.
16. * 创建人:Defonds
17. * 创建时间:2009-10-21 上午11:30:45
18. * 修改人:Defonds
19. * 修改时间:2009-10-21 上午11:30:45
20. * 修改备注:
21. * @version
22. *
23. */
24.public class ImageBean
25.{
26. //------------------------------------------------------
27. //fields.
28.
29. /**
30. * 地图图片的横坐标.
31. */
32. private int abscissa;
33.
34. /**
35. * 地图图片的纵坐标.
36. */
37. private int ordinate;
38.
39. /**
40. * 要下载地图的 http url 链接地址.
41. */
42. private String url;
43.
44. /**
45. * 下载的图片的字节流.
46. */
47. private byte[] byteOfImage;
48. //--------------------------------------------------------------------
49. //The getters and setters.
50.
51. public int getAbscissa()
52. {
53. return abscissa;
54. }
55. public void setAbscissa(int abscissa)
56. {
57. this.abscissa = abscissa;
58. }
59. public int getOrdinate()
60. {
61. return ordinate;
62. }
63. public void setOrdinate(int ordinate)
64. {
65. this.ordinate = ordinate;
66. }
67. public String getUrl()
68. {
69. return url;
70. }
71. public void setUrl(String url)
72. {
73. this.url = url;
74. }
75. public byte[] getByteOfImage()
76. {
77. return byteOfImage;
78. }
79. public void setByteOfImage(byte[] byteOfImage)
80. {
81. this.byteOfImage = byteOfImage;
82. }
83.
84.}
ImageManager.java(单例类负责所有本地图片的管理工作 [缓存器的管理类])
/**
02. * 文件名:ImageManager.java
03. *
04. * 版本信息:
05. * 日期:2009-10-28
06. * Copyright xxx Corporation 2009
07. * 版权所有
08. *
09. */
10.package com.xxx.util;
11.import java.io.IOException;
12.import java.util.Hashtable;
13.import javax.microedition.lcdui.Image;
14./**
15. *
16. * 项目名称:Basic1.0
17. * 类名称:ImageManager
18. * 类描述:单例类负责所有本地图片的管理工作 [缓存器的管理类]
19. * 创建人:Defonds
20. * 创建时间:2009-10-28 上午11:32:43
21. * 修改人:Defonds
22. * 修改时间:2009-10-28 上午11:32:43
23. * 修改备注:
24. * @version
25. *
26. */
27.public class ImageManager
28.{
29. /**
30. * 缓存器.专门用来存放程序中用到的图片.
31. */
32. private static Hashtable imageCache = null;
33.
34. /**
35. * 饿汉式单例模式,类加载器加载时就有了本类的一个实例,提高了系统效率.
36. */
37. private static ImageManager instance = new ImageManager();
38. /**
39. * 私有的构造子,防止被任意调用,保证本类在整个项目中只能有一个实例.
40. */
41. private ImageManager()
42. {
43. imageCache = new Hashtable();
44. }
45. /**
46. * 这里提供了一个供外部调用本 class 的静态方法,可以直接访问
47. */
48. public static ImageManager getInstance()
49. {
50. return instance;
51. }
52. /**
53. * 登记式缓存器的应用.
54. * 如果图片是第一次访问本方法,产生一个实例并返回.同时将此实例加载到缓存器之中
55. * 如果图片是第2,3,,,n次访问本方法,直接返回该图片实例,大大提高了系统运行效率
56. */
57. public Image getImage(String name)
58. {
59. Image image = null;
60. try
61. {
62. System.out.println("111111111111111");
63. if (null == imageCache.get(name))
64. {
65. System.out.println("222222222222222");
66. image = Image.createImage("/" + name + ".png");
67. System.out.println("33333333333333333333");
68. imageCache.put(name, image);
69. }else
70. {
71. image = (Image)imageCache.get(name);
72. }
73. }catch (IOException ioe)
74. {
75. ioe.printStackTrace();
76. }
77.
78. return image;
79. }
80.
81. /**
82. * 批量将一个数组中所有的图片放入缓存器[一般是在 MIDlet 中对缓存器初始化时使用
83. */
84. public void loadImagesCache(String[] names)
85. {
86. for (int i = 0; i < names.length; i++)
87. {
88. try
89. {
90. if (names[i] != null)
91. {
92. imageCache.put(names[i], Image.createImage("/" + names[i] + ".png"));
93. }
94. }catch (IOException ioe)
95. {
96. ioe.printStackTrace();
97. }
98. }
99. }
100.}
客户端使用缓存示例:
ImageManager imageManager = ImageManager.getInstance();
02.Image image = imageManager.getImage("logo");