设计模式之单件(Singleton)的应用

博客围绕在通讯设备上编写Java应用时遇到的数据读取和存储问题展开。因数据量大,无线传输慢且费钱,考虑将数据放设备上。为避免数据被Java垃圾回收机制清理,提出使用单件设计模式解决,还介绍了单件的类型及应用条件。

. 问题的引出

  今天,碰到一个问题,问题的描述如下:

在通讯设备(如手机)上编写一个Application,在这个Application,需要某个国家的所有机场和对应机场的航班.很显然,这些数据还是蛮大的,如果通过无限传输,肯定是比较慢,并且又浪费你的上网费,对吧.况且每次运行这个Application,都需要无限传输加载一次,这样不是太理想.于是我想把这些数据放在通讯设备上.这样就可以避免上述的情况,速度比较快,并且比较经济.

既然是放在通讯设备上,那么就得从这个设备上去读取.仔细一想,我运行这个Application时只需要从内存里面读取一次即可,不要每次用到这些数据的时候都去读取,这样效率应该不是很理想.

研究了一下,这个设备只支持用J2ME来编写这个Application.这样就引出了一个问题.如果把读取出来的数据作为一个变量放在那里,而不去用它.会出现什么情况呢?大家都知道Java有垃圾回收的机制.如果你不去调用它,它到时候会当成垃圾给回收,这样,当你去用的时候,这些数据已经不存在了.如何解决呢?

.问题的解决方案

很明显,单件就是比较合适的解决方案.为什么?

 第一,这个Application只需要一份机场以及机场航线的记录,这是利用单件很重要的原因之一.

第二,这个Application使用机场随时都有可能.换句话说,这个机场记录应该在Application运行期间随时都存在,而不应该被当成垃圾给回收掉.这样,让我们一步一步来想,如果记录不被回收掉,肯定应该有客户端来调用它,那么由谁来调用呢,显然,最后的调用者就是它本身.这样,最直接的结果就是,一旦这个记录被读取出来,他在运行的过程中就不会被回收.换句话说,就是单件一旦建立,这个记录就会存在,知道Application结束为止.

基于上面的2个原因,我认为单件是比较合适的选择.

.单件的描述

 单件分为饿汉式单件和懒汉式单件以及登记式单件,具体的情况可以参考GOF<<Design Pattern>>和阎宏的<<Java与模式>>.

 应用单件的条件是:在一个系统下,一个类只需要一个实例即可.在这种情况下才可用单件.比如说,我们用的Windows的回收站,打印池等等.

其实,我自己认为单件有很多时候都喜欢用错,不好区分,所以关于此,我还是得继续学习学习,深入思考呀.

,设计

系统的静态结构如下:singleton.gif

 

可以看到Airports的构造函数是私有的,调用getInstance()得到Airports的一个实例.

.源代码(Java编写):

 

 1None.gifpackage java.business.collection;
 2None.gifimport java.business.entity.Airport;
 3None.gif
 4None.gifpublic class Airports
 5ExpandedBlockStart.gifContractedBlock.gifdot.gif{
 6InBlock.gif    private static Airports mAirports=null;
 7InBlock.gif    private  static Airport[] mAirport=new Airport[200];
 8InBlock.gif    private Airports() //这里是私有构造
 9ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
10InBlock.gif        for(int i=0;i<200;i++)
11ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
12InBlock.gif            mAirport[i]=new Airport();
13ExpandedSubBlockEnd.gif        }

14InBlock.gif        loadAirportsAndAirlines();
15ExpandedSubBlockEnd.gif    }

16InBlock.gif    public static synchronized Airports getInstance() //注意这里需要synchronized 
17ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
18InBlock.gif        if(mAirports==null)
19ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
20InBlock.gif            mAirports=new Airports();
21ExpandedSubBlockEnd.gif        }

22InBlock.gif        return mAirports;
23ExpandedSubBlockEnd.gif    }

24InBlock.gif    private void loadAirportsAndAirlines()
25ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
26InBlock.gif        String strAirport="LGA";
27InBlock.gif        String[] strAirlines=new String[200];
28InBlock.gif        for(int i=0;i<200;i++)
29InBlock.gif        strAirlines[i]="";
30InBlock.gif        
31InBlock.gif          strAirlines[0]="AER LINGUS";
32InBlock.gif          strAirlines[1]="AIR ARUBU";
33InBlock.gif          strAirlines[2]="AMERICAN WEST";
34InBlock.gif          strAirlines[3]="AMERICAN INTL";
35InBlock.gif          strAirlines[4]="SOUTHWEST";
36InBlock.gif          strAirlines[5]="DELTA INTL";
37InBlock.gif          strAirlines[6]="MARK AIR";
38InBlock.gif          strAirlines[7]="SAS";
39InBlock.gif          strAirlines[8]="US AIR";
40InBlock.gif          strAirlines[9]="CHINA EAST";
41InBlock.gif          mAirport[0]=new Airport(strAirport,strAirlines);
42InBlock.gif          
43InBlock.gif          strAirlines=new String[200];
44InBlock.gif        for(int i=0;i<200;i++)
45InBlock.gif        strAirlines[i]="";
46InBlock.gif          strAirport="JFK Airport";
47InBlock.gif          strAirlines[0]="BAER LINGUS";
48InBlock.gif          strAirlines[1]="BAIR ARUBU";
49InBlock.gif          strAirlines[2]="BAMERICAN WEST";
50InBlock.gif          strAirlines[3]="BAMERICAN INTL";
51InBlock.gif          strAirlines[4]="BSOUTHWEST";
52InBlock.gif          strAirlines[5]="DELTA INTL";
53InBlock.gif          strAirlines[6]="MARK AIR";
54InBlock.gif          strAirlines[7]="SAS";
55InBlock.gif          strAirlines[8]="US AIR";
56InBlock.gif          strAirlines[9]="CHINA EAST";
57InBlock.gif          mAirport[1]=new Airport(strAirport,strAirlines);
58ExpandedSubBlockEnd.gif    }

59InBlock.gif    public Airport getAirlinesByAirport(String airport)
60ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
61InBlock.gif        int size=mAirport.length;
62InBlock.gif        for(int i=0;i<size;i++)
63ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
64InBlock.gif            if(mAirport[i].getAirport().trim().equals(airport))
65ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
66InBlock.gif                return  mAirport[i];
67ExpandedSubBlockEnd.gif            }

68ExpandedSubBlockEnd.gif        }

69InBlock.gif        return null;
70ExpandedSubBlockEnd.gif    }

71InBlock.gif    public String[] getAllAirports()
72ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
73InBlock.gif        String[] airports=new String[200];
74InBlock.gif        int size=mAirport.length;
75InBlock.gif        for(int i=0;i<size;i++)
76ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
77InBlock.gif            if(mAirport[i].getAirport()==null)
78InBlock.gif            airports[i]="";
79InBlock.gif             else
80InBlock.gif            airports[i]=mAirport[i].getAirport();    
81ExpandedSubBlockEnd.gif       }

82InBlock.gif       return airports;
83ExpandedSubBlockEnd.gif    }

84ExpandedBlockEnd.gif}

85None.gif

Airport类的代码:

 1None.gifpackage java.business.entity;
 2None.gif
 3ExpandedBlockStart.gifContractedBlock.gif/**//**
 4InBlock.gif * Airport,including its airlines
 5ExpandedBlockEnd.gif */

 6None.gifpublic class Airport
 7ExpandedBlockStart.gifContractedBlock.gifdot.gif{
 8InBlock.gif    private String mAirportName;
 9InBlock.gif    private String[]  mAirlines=new String[200];
10InBlock.gif    
11InBlock.gif    private void Init()
12ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
13InBlock.gif        for(int i=0;i<200;i++)
14ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
15InBlock.gif            mAirlines[i]="";
16ExpandedSubBlockEnd.gif        }

17ExpandedSubBlockEnd.gif    }

18InBlock.gif     public Airport()
19ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
20InBlock.gif        Init();
21ExpandedSubBlockEnd.gif    }

22InBlock.gif    public Airport(String airport)
23ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
24InBlock.gif        Init();
25InBlock.gif        mAirportName=airport;
26ExpandedSubBlockEnd.gif    }

27InBlock.gif    public Airport(String airport,String[] airlines)
28ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
29InBlock.gif        Init();
30InBlock.gif        mAirportName=airport;
31InBlock.gif        mAirlines=airlines;
32ExpandedSubBlockEnd.gif    }

33InBlock.gif    public void serAirport(String value)
34ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
35InBlock.gif         mAirportName=value;
36ExpandedSubBlockEnd.gif    }

37InBlock.gif    public String getAirport()
38ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
39InBlock.gif        return mAirportName;
40ExpandedSubBlockEnd.gif    }

41InBlock.gif    public void setAirlines(String[] airlines)
42ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
43InBlock.gif        mAirlines=airlines;
44ExpandedSubBlockEnd.gif    }

45InBlock.gif     public String[] getAirlines()
46ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
47InBlock.gif        return mAirlines;
48ExpandedSubBlockEnd.gif    }

49ExpandedBlockEnd.gif  }

50None.gif

 

 

 

 

 

 

转载于:https://www.cnblogs.com/confach/archive/2005/04/26/145857.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值