zoukankan      html  css  js  c++  java
  • 设计模式之单件(Singleton)的应用

    . 问题的引出

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

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

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

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

    .问题的解决方案

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

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

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

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

    .单件的描述

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

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

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

    ,设计

    系统的静态结构如下:

     

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

    .源代码(Java编写):

     

     1package java.business.collection;
     2import java.business.entity.Airport;
     3
     4public 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类的代码:

     1package java.business.entity;
     2
     3/**
     4 * Airport,including its airlines
     5 */

     6public 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

     

     

     

  • 相关阅读:
    keepalvied虚拟ip安装设置
    mysql 主从,主主,主主复制时的主键冲突解决
    mysql备份,知识点
    mysql自定义函数语法
    sql之left join、right join、inner join的区别
    mysql 日志文件mysql-bin文件清除方法,和mysql-bin相关文件的配置
    mysql日志总结
    并查集 专题总结
    最短路径 专题总结
    Dancing Links 专题总结
  • 原文地址:https://www.cnblogs.com/confach/p/145857.html
Copyright © 2011-2022 走看看