91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java基于享元模式實現五子棋游戲功能實例詳解

發布時間:2020-10-25 22:26:14 來源:腳本之家 閱讀:199 作者:chengqiuming 欄目:編程語言

本文實例講述了Java基于享元模式實現五子棋游戲功能。分享給大家供大家參考,具體如下:

一、模式定義

享元模式,以共享的方式高效地支持大量的細粒度對象。通過復用內存中已存在的對象,降低系統創建對象實例的性能消耗。享元的英文是Flyweight,表示特別小的對象,即細粒度對象。

二、模式舉例

1. 模式分析

我們借用五子棋游戲來說明這一模式。

Java基于享元模式實現五子棋游戲功能實例詳解

2. 享元模式靜態類圖

Java基于享元模式實現五子棋游戲功能實例詳解

3. 代碼示例

3.1 創建抽象棋子一AbstractChessman

package com.demo.flyweight.object;
public abstract class AbstractChessman {
  // 棋子坐標
  protected int x;
  protected int y;
  // 棋子類別(黑|白)
  protected String chess;
  public AbstractChessman(String chess) {
    this.chess = chess;
  }
  // 點坐標設置
  public abstract void point(int x, int y);
  // 顯示棋子信息
  public void show() {
    System.out.println(this.chess + "(" + this.x + "," + this.y + ")");
  }
}

3.2 創建黑子一BlackChessman

package com.demo.flyweight.object;
public class BlackChessman extends AbstractChessman {
  /**
   * 構造方法 初始化黑棋子
   */
  public BlackChessman() {
    super("●");
    System.out.println("--BlackChessman Construction Exec!!!");
  }
  // 點坐標設置
  @Override
  public void point(int x, int y) {
    this.x = x;
    this.y = y;
    // 顯示棋子內容
    show();
  }
}

3.3 創建白子一WhiteChessman

package com.demo.flyweight.object;
public class WhiteChessman extends AbstractChessman {
  /**
   * 構造方法 初始化白棋子
   */
  public WhiteChessman() {
    super("○");
    System.out.println("--WhiteChessman Construction Exec!!!");
  }
  // 點坐標設置
  @Override
  public void point(int x, int y) {
    this.x = x;
    this.y = y;
    // 顯示棋子內容
    show();
  }
}

3.4 創建棋子工廠一FiveChessmanFactory

package com.demo.flyweight.factory;
import java.util.Hashtable;
import com.demo.flyweight.object.AbstractChessman;
import com.demo.flyweight.object.BlackChessman;
import com.demo.flyweight.object.WhiteChessman;
public class FiveChessmanFactory {
  // 單例模式工廠
  private static FiveChessmanFactory fiveChessmanFactory = new FiveChessmanFactory();
  // 緩存存放共享對象
  private final Hashtable<Character, AbstractChessman> cache = new Hashtable<Character, AbstractChessman>();
  // 私有化構造方法
  private FiveChessmanFactory() {
  }
  // 獲得單例工廠
  public static FiveChessmanFactory getInstance() {
    return fiveChessmanFactory;
  }
  /**
   * 根據字符獲得棋子
   *
   * @param c
   *      (B:黑棋 W:白棋)
   * @return
   */
  public AbstractChessman getChessmanObject(char c) {
    // 從緩存中獲得棋子對象實例
    AbstractChessman abstractChessman = this.cache.get(c);
    if (abstractChessman == null) {
      // 緩存中沒有棋子對象實例信息 則創建棋子對象實例 并放入緩存
      switch (c) {
      case 'B':
        abstractChessman = new BlackChessman();
        break;
      case 'W':
        abstractChessman = new WhiteChessman();
        break;
      default:
        break;
      }
      // 為防止 非法字符的進入 返回null
      if (abstractChessman != null) {
        // 放入緩存
        this.cache.put(c, abstractChessman);
      }
    }
    // 如果緩存中存在 棋子對象則直接返回
    return abstractChessman;
  }
}

3.5 客戶端實現一Client

package com.demo;
import java.util.Random;
import com.demo.flyweight.factory.FiveChessmanFactory;
import com.demo.flyweight.object.AbstractChessman;
/**
 * 主應用程序
 *
 * @author
 */
public class Client {
  /**
   * @param args
   */
  public static void main(String[] args) {
    // 創建五子棋工廠
    FiveChessmanFactory fiveChessmanFactory = FiveChessmanFactory
        .getInstance();
    Random random = new Random();
    int radom = 0;
    AbstractChessman abstractChessman = null;
    // 隨機獲得棋子
    for (int i = 0; i < 10; i++) {
      radom = random.nextInt(2);
      switch (radom) {
      // 獲得黑棋
      case 0:
        abstractChessman = fiveChessmanFactory.getChessmanObject('B');
        break;
      // 獲得白棋
      case 1:
        abstractChessman = fiveChessmanFactory.getChessmanObject('W');
        break;
      }
      if (abstractChessman != null) {
        abstractChessman.point(i, random.nextInt(15));
      }
    }
  }
}

4. 運行結果

--WhiteChessman Construction Exec!!!

○(0,2)

○(1,6)

--BlackChessman Construction Exec!!!

●(2,3)

○(3,14)

○(4,13)

○(5,8)

●(6,14)

●(7,0)

●(8,3)

○(9,8)

三、享元模式的兩種狀態

內蘊狀態不會隨環境的改變而改變,是存儲在享元對象內部狀態信息,困此內蘊狀態是可以共享的,對于任何一個享元對象來講,它的值是完全相同的。就像五子棋中的"黑子"和"白子",它代表的狀態就是內蘊狀態。

外蘊狀態它會隨環境的改變而改變,因此不可以共享狀態,對于不同的享元對象講,它的值可能是不同的。享元對象的外蘊狀態必須由客戶端保存,在享元對象被創建之后,需要使用的時候再傳入享元對象內部。就像五子棋的位置信息,代表的狀態就是享元對象的外蘊狀態。

所以,享元的外蘊狀態和內蘊狀態是兩類相互獨立的狀態,彼此沒關聯。

四、該模式設計原則

1. 共享細粒度對象,降低內存空間。

2. 有效地隔離系統中變化部分和不變部分。

五、使用場合

1. 當系統中某個對象類型的實例較多的時候。

2. 在系統設計中,對象實例進行分類后,發現真正有區別的分類很少的時候。

六、享元模式靜態類圖

Java基于享元模式實現五子棋游戲功能實例詳解

更多關于java算法相關內容感興趣的讀者可查看本站專題:《Java數據結構與算法教程》、《Java操作DOM節點技巧總結》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》

希望本文所述對大家java程序設計有所幫助。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

西安市| 利津县| 凤凰县| 曲周县| 克什克腾旗| 望都县| 太保市| 水富县| 大洼县| 报价| 仪陇县| 黄山市| 吴忠市| 永安市| 阿瓦提县| 彝良县| 肇州县| 桐梓县| 阿合奇县| 根河市| 新密市| 长寿区| 桃园县| 通榆县| 盐源县| 崇州市| 梅州市| 永新县| 通辽市| 桃园市| 昭通市| 宣恩县| 大田县| 思茅市| 高邮市| 北辰区| 衡阳县| 海淀区| 襄樊市| 台中市| 本溪市|