// 抽象单位 abstract class Unit { public abstract function getMaterial(); // 取得材料 public abstract function train(); // 訓練 public abstract function create(); // 產生 }
// 工人 class Worker extends Unit { // 取得材料 public function getMaterial() { echo "使用了50單位的水晶<br/>"; } // 訓練 public function train() { echo "訓練時間10秒<br/>"; } // 產生 public function create() { echo "I am a Worker, I am ready to Work! <br/><br/>"; } }
// 士兵 class Solider extends Unit { // 取得材料 public function getMaterial() { echo "使用了50單位的水晶、10單位的瓦斯<br/>"; } // 訓練 public function train() { echo "訓練時間20秒<br/>"; } // 產生 public function create() { echo "I am a Solider, Waiting for your order!<br/><br/>"; } }
SimpleFactory(簡單工具模式)
1 2 3 4 5 6 7 8 9 10 11 12 13
// 簡單建築物工廠 class SimpleBuildFactory { public static function createUnit($type) { switch($type) { case "solider": return new Solider(); break; case "worker": return new Worker(); break; } } }
Client(委託人)
1 2 3 4 5 6 7 8 9 10 11 12
// 生產中心 class CreateBuildCenter { public function outputUnit($type){ $unit = SimpleBuildFactory::createUnit($type); // 把會變動的部分抽離出來,變成簡單工廠 $unit->getMaterial(); $unit->train(); $unit->create(); return $unit; } }
// 指導中心 class CommandCenter extends BuildFactory { public function outputUnit() { return new Worker(); } } // 軍營 class Barrack extends BuildFactory() { public function outputUnit() { return new Solider(); } } // 空軍基地 class Airport extends BuildFactory { public function outputUnit() { $aircraft = new Aircraft(); $aircraft->build(); return $aircraft; } }
Product
1 2 3 4
abstract class Unit { public abstract function playSlogan(); // 播放單位口號
// 工人 class Worker extends Unit { public function playSlogan() { echo "SUV準備好了,長官您想蓋什麼建築呢?<br/><br/>"; } } // 士兵 class Solider extends Unit { public function playSlogan() { echo "快給我戰鬥機吧!!<br/><br/>"; } } // 飛機 class Aircraft extends Unit { public function playSlogan() { echo "我已經準備好起飛出擊了,長官!<br/><br/>"; } public function build() { echo "組裝飛機中...<br/>"; } }