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程式設計有所幫助。