1. 程式人生 > 程式設計 >php設計模式之抽象工廠模式分析【星際爭霸遊戲案例】

php設計模式之抽象工廠模式分析【星際爭霸遊戲案例】

本文例項講述了php設計模式之抽象工廠模式。分享給大家供大家參考,具體如下:

星際爭霸是戰略遊戲,所以同樣的兵種,敵我顯示是不同的。
典型的就是滑鼠的顏色,點中自己的物體的時候,滑鼠顏色變成綠色,點中敵人的物體的時候,滑鼠顏色變成紅色。
還有就是每個物體的狀態,點中自己的物體的時候,狀態區顯示完整的狀態,點中敵人的物體的時候,狀態區顯示一部分資訊。
我們假設只考慮滑鼠和人族的運輸船,玩家自己的運輸船點中後狀態區會顯示裡面裝載的部隊,而點中敵人的則不會顯示裡面是否裝載部隊。
這樣我們就有四種物件:點中自己的滑鼠,點中敵人的滑鼠,自己的運輸船狀態,敵人的運輸船狀態。
如果用工廠方法模式,就要建立四個具體工廠(或者子工廠),這樣的程式碼不便於維護和修改,因為我們以後要增加另一種情況:盟友。

待解決的問題:我們希望將這些物件聯絡起來,使得工廠的操作更加有邏輯性。

思路:既然我們通過自己和敵人來區分物件,那麼統一歸屬的物件放入相同的具體工廠,每個具體工廠負責製造多種物件。

抽象工廠模式示例:

<?php
  //四個產品類
  //點中自己的物體時的滑鼠
  class mineMouse
  {
    //滑鼠的顏色
    public $color = 'green';
  }
  //點中敵人的物體時的滑鼠
  class enemyMouse
  {
    //滑鼠的顏色
    public $color = 'red';
  }
  //自己的運輸船狀態
  class mineDropship
  {
    //顯示裝載的情況,假設2輛坦克
    public $loading = '2 tanks';
  }
  //敵人的運輸船狀態
  class enemyDropship
  {
    //不顯示裝載的情況
    public $loading = '';
  }
  //主工廠類,也叫抽象工廠類
  class abstractCreator
  {
    //根據引數分配工作到具體的工廠,並返回具體工廠物件
    public function getCreator($belong)
    {
      //獲取具體工廠的類名
      $creatorClassName = $belong.'Creator';
      //返回具體工廠物件
      return new $creatorClassName();
    }
  }
  //具體工廠必須執行的介面
  interface productCreator
  {
    //製造方法,或者說根據引數返回產品(滑鼠,運輸船)的方法
    public function creatProduct($productName);
  }
  //製造屬於自己的物體的具體工廠,執行介面
  class mineCreator implements productCreator
  {
    //根據引數生產並返回屬於自己的產品
    public function creatProduct($productName)
    {
      //獲取產品的類名
      $productClassName = 'mine'.$productName;
      //返回產品物件
      return new $productClassName;
    }
  }
  //製造屬於敵人的物體的具體工廠,執行介面
  class enemyCreator implements productCreator
  {
    //根據引數生產並返回屬於敵人的產品
    public function creatProduct($productName)
    {
      //獲取產品的類名
      $productClassName = 'enemy'.$productName;
      //返回產品物件
      return new $productClassName;
    }
  }
  //開始操作
  //新建抽象工廠物件
  $abstractCreator = new abstractCreator();
  //根據歸屬,得到具體工廠物件,這裡先演示敵人的
  $realCreator1 = $abstractCreator->getCreator('enemy');
  //讓具體工廠物件生產滑鼠物件
  $product1 = $realCreator1->creatProduct('Mouse');
  //讓滑鼠物件顯示顏色,顯示結果red
  echo $product1->color;
  //根據歸屬,得到另一個具體工廠物件,這裡演示自己的
  $realCreator2 = $abstractCreator->getCreator('mine');
  //讓具體工廠物件生產運輸船
  $product2 = $realCreator2->creatProduct('Dropship');
  //讓運輸船物件顯示裝載物件,顯示結果2 tanks,兩輛坦克
  echo $product2->loading;
?>

執行結果:

red2 tanks

用途總結:抽象工廠模式將擁有相同屬性的產品歸類到同一個具體工廠,減少具體工廠的數量,操作的時候,可以理清職責。

實現總結:需要一個根據屬性返回具體工廠物件的抽象工廠,比如上面abstractCreator,同時需要將各個產品的屬性(自己的,敵人的)進行歸類,根據屬性建立各個具體工廠,每個具體工廠製造多個具有相同屬性的不同產品(滑鼠和運輸船)。

更多關於PHP相關內容感興趣的讀者可檢視本站專題:《php面向物件程式設計入門教程》、《PHP陣列(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運算與運算子用法總結》、《php字串(string)用法總結》、《php+mysql資料庫操作入門教程》及《php常見資料庫操作技巧彙總》

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