A Cooly Weblog

             ::  ::  ::  ::  :: 管理

          多例模式Multiton

          Posted on 2007-02-22 21:45 acooly 閱讀(686) 評論(1)  編輯  收藏 所屬分類: Java開發 、設計模式
          ??????多例模式Multiton基本特性同單例Singleton,由自己創建和管理自身實例,并向系統提供自身實例。不同之處是多例類在同一容器(類加載器)或JVM中可以存在多個實例。

          應用實例:序列鍵值生成器

          本例采用hqldb作為演示數據庫。表結構如下:

          CREATE?TABLE?KEYTABLE(
          ? KEYNAME?VARCHAR(32)?NOT?NULL?PRIMARY?KEY,
          ? KEYVALUE?int?NOT?NULL
          )



          package?pattern.multiton;

          import?java.sql.Connection;
          import?java.sql.Driver;
          import?java.sql.DriverManager;
          import?java.sql.ResultSet;
          import?java.sql.Statement;

          /*
          ?*?Key?service<br>
          ?*?table?strunction:<br/>
          ?*?CREATE?TABLE?KEYTABLE(<br/>
          ?*?KEYNAME?VARCHAR(32)?NOT?NULL?PRIMARY?KEY,<br/>
          ?*?KEYVALUE?int?NOT?NULL<br/>
          ?*?)<br>
          ?@author?ZhangPu
          ?Feb?22,?2007?4:30:47?PM
          ?
          */


          public?class?KeyService?{

          ????
          private?int?cache;
          ????
          private?String?keyName;
          ????
          ????
          private?int?maxValue;
          ????
          private?int?nextValue;
          ????
          ????
          public?KeyService(int?cache,String?keyName)?{
          ??????
          this.cache?=?cache;
          ??????
          this.keyName?=?keyName;
          ??????retrieveKey();
          ????}


          ????
          /**
          ?????*?get?next?key?form?keyinfo
          ?????*?
          ?????*?
          @return
          ?????
          */

          ????
          public?int?getNextKey()?{
          ????????
          if(nextValue?>=?maxValue){
          ????????????retrieveKey();
          ????????}

          ????????
          return?nextValue++;
          ????}

          ????
          ????
          /**
          ?????*?retrieve?current?value?form?db.
          ?????*?
          @return
          ?????
          */

          ????
          private?void?retrieveKey(){
          ????????System.out.println(
          "retrieve?database!");
          ????????
          ????????String?sqlUpdate?
          =?"update?KEYTABLE?set?KEYVALUE?=?KEYVALUE?+?"?+?cache?+?"?where?KEYNAME?=?'"+keyName+"'";?
          ????????String?sqlSelete?
          =?"select?KEYVALUE?from?KEYTABLE?where?KEYNAME?=?'"+keyName+"'";
          ????????
          ????????Connection?conn?
          =?null;
          ????????Statement?stmt?
          =?null;
          ????????
          int?keyFormDb?=?0;
          ????????
          try{
          ????????????Driver?driver?
          =?(Driver)Class.forName("org.hsqldb.jdbcDriver").newInstance();
          ????????????DriverManager.registerDriver(driver);
          ????????????
          ????????????String?url?
          =?"jdbc:hsqldb:hsql://localhost/pattern";
          ????????????String?user?
          =?"sa";
          ????????????String?passwd?
          =?"";
          ????????????conn?
          =?DriverManager.getConnection(url,user,passwd);
          ????????????stmt?
          =?conn.createStatement();
          ????????????stmt.executeUpdate(sqlUpdate);
          ????????????ResultSet?rs?
          =?stmt.executeQuery(sqlSelete);
          ????????????
          if(rs?!=?null?&&?rs.next()){
          ????????????????keyFormDb?
          =?rs.getInt(1);
          ????????????}

          ????????????
          ????????}
          catch(Exception?e){
          ????????????
          try?{
          ????????????????stmt.close();
          ????????????????conn.close();
          ????????????}
          ?catch?(Exception?ex)?{
          ????????????????ex.printStackTrace();
          ????????????}

          ????????????e.printStackTrace();
          ????????}


          ????????maxValue?
          =?keyFormDb;
          ????????nextValue?
          =?keyFormDb?-?cache;

          ????}

          ????

          }



          package?pattern.multiton;

          import?java.util.HashMap;
          import?java.util.Map;

          /*
          ?*?KeyGenerator?with?multiton?pattern
          ?@author?ZhangPu
          ?Feb?22,?2007?5:55:24?PM
          ?
          */

          public?class?KeyGenerator?{
          ????
          ????
          /**
          ?????*?save?keyServices
          ?????
          */
          ????
          private?static?Map<String,KeyGenerator>?KeyGenerators?=?new?HashMap<String,KeyGenerator>();
          ????
          /**
          ?????*?the?current?instance.
          ?????
          */
          ????
          private?KeyService?keyService;
          ????
          /**
          ?????*?cache?pool?size
          ?????
          */
          ????
          private?static?final?int?KEY_CACHE?=?20;
          ????
          ????
          private?KeyGenerator(){}
          ????
          ????
          private?KeyGenerator(String?keyName){
          ?????????keyService?
          =?new?KeyService(KEY_CACHE,keyName);
          ????}
          ????
          ????
          /**
          ?????*?Multiton?instance
          ?????*?
          @param?keyName
          ?????*?
          @return
          ?????
          */
          ????
          public?synchronized?static?KeyGenerator?getInstance(String?keyName){
          ????????
          ????????KeyGenerator?keyGenerator;
          ????????
          if(KeyGenerators.containsKey(keyName)){
          ????????????keyGenerator?
          =?KeyGenerators.get(keyName);
          ????????}
          else{
          ????????????keyGenerator?
          =?new?KeyGenerator(keyName);
          ????????????KeyGenerators.put(keyName,?keyGenerator);
          ????????}
          ????????
          return?keyGenerator;
          ????}
          ????
          ????
          /**
          ?????*?business?method.
          ?????*?
          @return
          ?????
          */
          ????
          public?int?getNextKey(){
          ????????
          return?keyService.getNextKey();
          ????}
          ????
          ????
          }

          package?pattern.multiton;

          /*
          ?@author?ZhangPu
          ?Feb?22,?2007?6:27:22?PM
          ?
          */


          public?class?Client?{

          ????
          public?static?void?main(String[]?args)?{
          ????????String?keyName?
          =?"SYS_RESOURCE";
          ????????KeyGenerator?keyGenerator?
          =?KeyGenerator.getInstance(keyName);
          ????????
          ????????
          for(int?i=0;i<20;i++){
          ????????????System.out.println(
          "time"+(i+1)+":"+keyGenerator.getNextKey());
          ????????}

          ????}

          }


          評論

          # re: 多例模式Multiton  回復  更多評論   

          2009-10-29 11:38 by 0907
          很好,辛苦
          主站蜘蛛池模板: 河间市| 黔西县| 察哈| 景东| 临桂县| 临安市| 镇原县| 忻州市| 资中县| 张家口市| 奉新县| 芦山县| 黔江区| 庆阳市| 越西县| 饶平县| 大荔县| 彭山县| 乐业县| 彝良县| 宜春市| 台州市| 峨边| 兰坪| 黔江区| 福建省| 静海县| 定日县| 孙吴县| 舟山市| 荣昌县| 安新县| 都昌县| 镇康县| 盐山县| 本溪市| 通州市| 西林县| 兴宁市| 会理县| 汶川县|