一. 问题的引出
今天,碰到一个问题,问题的描述如下:
在通讯设备(如手机)上编写一个Application,在这个Application中,需要某个国家的所有机场和对应机场的航班.很显然,这些数据还是蛮大的,如果通过无限传输,肯定是比较慢,并且又浪费你的上网费,对吧.况且每次运行这个Application,都需要无限传输加载一次,这样不是太理想.于是我想把这些数据放在通讯设备上.这样就可以避免上述的情况,速度比较快,并且比较经济.
既然是放在通讯设备上,那么就得从这个设备上去读取.仔细一想,我运行这个Application时只需要从内存里面读取一次即可,不要每次用到这些数据的时候都去读取,这样效率应该不是很理想.
研究了一下,这个设备只支持用J2ME来编写这个Application.这样就引出了一个问题.如果把读取出来的数据作为一个变量放在那里,而不去用它.会出现什么情况呢?大家都知道Java有垃圾回收的机制.如果你不去调用它,它到时候会当成垃圾给回收,这样,当你去用的时候,这些数据已经不存在了.如何解决呢?
二.问题的解决方案
很明显,单件就是比较合适的解决方案.为什么?
第一,这个Application只需要一份机场以及机场航线的记录,这是利用单件很重要的原因之一.
第二,这个Application使用机场随时都有可能.换句话说,这个机场记录应该在Application运行期间随时都存在,而不应该被当成垃圾给回收掉.这样,让我们一步一步来想,如果记录不被回收掉,肯定应该有客户端来调用它,那么由谁来调用呢,显然,最后的调用者就是它本身.这样,最直接的结果就是,一旦这个记录被读取出来,他在运行的过程中就不会被回收.换句话说,就是单件一旦建立,这个记录就会存在,知道Application结束为止.
基于上面的2个原因,我认为单件是比较合适的选择.
三.单件的描述
单件分为饿汉式单件和懒汉式单件以及登记式单件,具体的情况可以参考GOF的<<Design Pattern>>和阎宏的<<Java与模式>>.
应用单件的条件是:在一个系统下,一个类只需要一个实例即可.在这种情况下才可用单件.比如说,我们用的Windows的回收站,打印池等等.
其实,我自己认为单件有很多时候都喜欢用错,不好区分,所以关于此,我还是得继续学习学习,深入思考呀.
四,设计
系统的静态结构如下:
可以看到Airports的构造函数是私有的,调用getInstance()得到Airports的一个实例.
五.源代码(Java编写):
1
package java.business.collection;
2
import java.business.entity.Airport;
3
4
public class Airports
5

{
6
private static Airports mAirports=null;
7
private static Airport[] mAirport=new Airport[200];
8
private Airports() //这里是私有构造
9
{
10
for(int i=0;i<200;i++)
11
{
12
mAirport[i]=new Airport();
13
}
14
loadAirportsAndAirlines();
15
}
16
public static synchronized Airports getInstance() //注意这里需要synchronized
17
{
18
if(mAirports==null)
19
{
20
mAirports=new Airports();
21
}
22
return mAirports;
23
}
24
private void loadAirportsAndAirlines()
25
{
26
String strAirport="LGA";
27
String[] strAirlines=new String[200];
28
for(int i=0;i<200;i++)
29
strAirlines[i]="";
30
31
strAirlines[0]="AER LINGUS";
32
strAirlines[1]="AIR ARUBU";
33
strAirlines[2]="AMERICAN WEST";
34
strAirlines[3]="AMERICAN INTL";
35
strAirlines[4]="SOUTHWEST";
36
strAirlines[5]="DELTA INTL";
37
strAirlines[6]="MARK AIR";
38
strAirlines[7]="SAS";
39
strAirlines[8]="US AIR";
40
strAirlines[9]="CHINA EAST";
41
mAirport[0]=new Airport(strAirport,strAirlines);
42
43
strAirlines=new String[200];
44
for(int i=0;i<200;i++)
45
strAirlines[i]="";
46
strAirport="JFK Airport";
47
strAirlines[0]="BAER LINGUS";
48
strAirlines[1]="BAIR ARUBU";
49
strAirlines[2]="BAMERICAN WEST";
50
strAirlines[3]="BAMERICAN INTL";
51
strAirlines[4]="BSOUTHWEST";
52
strAirlines[5]="DELTA INTL";
53
strAirlines[6]="MARK AIR";
54
strAirlines[7]="SAS";
55
strAirlines[8]="US AIR";
56
strAirlines[9]="CHINA EAST";
57
mAirport[1]=new Airport(strAirport,strAirlines);
58
}
59
public Airport getAirlinesByAirport(String airport)
60
{
61
int size=mAirport.length;
62
for(int i=0;i<size;i++)
63
{
64
if(mAirport[i].getAirport().trim().equals(airport))
65
{
66
return mAirport[i];
67
}
68
}
69
return null;
70
}
71
public String[] getAllAirports()
72
{
73
String[] airports=new String[200];
74
int size=mAirport.length;
75
for(int i=0;i<size;i++)
76
{
77
if(mAirport[i].getAirport()==null)
78
airports[i]="";
79
else
80
airports[i]=mAirport[i].getAirport();
81
}
82
return airports;
83
}
84
}
85
Airport类的代码:
1
package java.business.entity;
2
3
/**//**
4
* Airport,including its airlines
5
*/
6
public class Airport
7

{
8
private String mAirportName;
9
private String[] mAirlines=new String[200];
10
11
private void Init()
12
{
13
for(int i=0;i<200;i++)
14
{
15
mAirlines[i]="";
16
}
17
}
18
public Airport()
19
{
20
Init();
21
}
22
public Airport(String airport)
23
{
24
Init();
25
mAirportName=airport;
26
}
27
public Airport(String airport,String[] airlines)
28
{
29
Init();
30
mAirportName=airport;
31
mAirlines=airlines;
32
}
33
public void serAirport(String value)
34
{
35
mAirportName=value;
36
}
37
public String getAirport()
38
{
39
return mAirportName;
40
}
41
public void setAirlines(String[] airlines)
42
{
43
mAirlines=airlines;
44
}
45
public String[] getAirlines()
46
{
47
return mAirlines;
48
}
49
}
50