隨筆-126  評論-247  文章-5  trackbacks-0

          多例模式實際上就是單例模式的推廣,多例模式又劃分為有上限多例模式無上限多例模式兩種,有上限多例模式中的多例類的實例是有上限的,
          當這個多例類中的上限數值上等于 1 時,此時,多例類退化回到了單例類;而對于無上限多例模式中的多例類,它的上限是沒有限制的,也就是說它的上限數值是不確定的,
          這個多例類并不一定能夠退化成單例類;

          單例模式與多例模式一般性結構:


          多例模式特點:
               1. 多例類可以有多個實例
               2. 多例類必須自己創建自己的實例,并管理自己的實例,和向外界提供自己的實例


          多例類的一個實例,比如:一副麻將都需要有兩顆骰子,在沒有特別意外發生的情況下,這副麻將打多少圈用的都將是這兩顆骰子,兩顆骰子代表的是不同的兩個狀態,
          這里可以將骰子設計成多例類,如圖:


          多例類:Dice.java

          package pattern.multion;

          import java.util.Random;
          /**
           * -----------------------------------------
           * @描述  骰子有上限多例類
           * @作者  fancy
           * @郵箱  fancydeepin@yeah.net
           * @日期  2012-7-31 <p>
           * -----------------------------------------
           
          */

          public class Dice {

              
          public  static final int  INSTANCE1 = 0;
              
          public  static final int  INSTANCE2 = 1;
              
          private static final Dice DICE_INSTANCE1 = new Dice(); //餓漢式
              private static final Dice DICE_INSTANCE2 = new Dice(); //餓漢式
              
              
          //私有化構造子,阻止外部直接實例化對象
              private Dice(){
                  
              }

              
              
          /**
               * <B>方法描述:</B>
               * <p style="margin-left:20px;color:#A52A2A;">
               * 獲取多例類的實例
               * 
          @param which <span style="color: #008080;"> 取值范圍:<BR>
               * ① Dice.INSTANCE1:返回Dice的第一個實例對象<BR>
               * ② Dice.INSTANCE2:返回Dice的第二個實例對象<BR>
               * </span>
               * 
          @return <span style="color: #008080;"> 返回Dice的一個實例對象 </span>
               
          */

              
          public static Dice getInstance(int which){
                  
                  
          switch(which){
                      
          case INSTANCE1 :
                          
          return DICE_INSTANCE1;
                      
          case INSTANCE2 :
                          
          return DICE_INSTANCE2;
                      
          default :
                          
          try {
                              
          throw new Exception("找不到與參數 " + which + " 相匹配的實例!");
                          }
           catch (Exception e) {e.printStackTrace();}
                  }

                  
          return null;
              }

              
              
          /**
               * <B>方法描述:</B>
               * <p style="margin-left:20px;color:#A52A2A;">
               * 此方法是線程安全的,調用該方法來擲骰子
               * 
          @return <span style="color: #008080;"> 返回骰子的點數 </span>
               
          */

              
          public synchronized int roll(){
                  
                  
          try {
                      Random ran 
          = new Random(System.currentTimeMillis());
                      
          int rollValue = ran.nextInt();
                      rollValue 
          %= 6;
                      Thread.sleep(
          6);
                      
          return rollValue > 0 ? ++rollValue : --rollValue * -1;
                  }
           catch (Exception e) {e.printStackTrace();}
                  
                  
          return 1;
              }

          }



          客戶端測試類:Mahjong.java

          package pattern.multion;
          /**
           * -----------------------------------------
           * @描述  客戶端測試類
           * @作者  fancy
           * @郵箱  fancydeepin@yeah.net
           * @日期  2012-7-31 <p>
           * -----------------------------------------
           
          */

          public class Mahjong {

              
          private static Dice dice1 = Dice.getInstance(Dice.INSTANCE1),
                                                    dice2 
          = Dice.getInstance(Dice.INSTANCE2);
              
              
          public static void main(String[] args){

                  
          int value1 = dice1.roll();
                  
          int value2 = dice2.roll();
                  System.out.println(value1);
                  System.out.println(value2);
              }

              
          }



            
          posted on 2012-07-31 17:44 fancydeepin 閱讀(4026) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 秦皇岛市| 阳春市| 玛沁县| 岳西县| 河源市| 鱼台县| 武安市| 石棉县| 科技| 凉城县| 武山县| 香港 | 遂平县| 盐源县| 台东县| 南宫市| 丰宁| 仲巴县| 昌宁县| 克拉玛依市| 濮阳市| 陆丰市| 荆州市| 正蓝旗| 平罗县| 长宁县| 景德镇市| 丰镇市| 南岸区| 缙云县| 大港区| 佳木斯市| 玛纳斯县| 虞城县| 堆龙德庆县| 桐庐县| 宜川县| 屯门区| 涞源县| 灌云县| 驻马店市|