PHP嘚設計模式

前言

  • 目前公司

Design Patterns書中23個設計模式

Creational Patterns(生成模式)

  • Simple Factory(簡單工廠模式)
  • Factory Method(工廠方法模式)
  • Abstract Factory(抽象工廠模式)
  • Builder(生成器模式)
  • Prototype(原型模式)
  • Singleton(單例模式)

Behavioral Patterns(行為模式)

  • Chain of Responsibility(責任鏈模式)
  • Command(命令模式)

Simple Factory(簡單工廠模式)

Simple Factory : UML
Simple Factory-UML
範例

  • 現在有一個基地需要訓練兩種單位:工人與士兵
  • 一般老百姓要成為工人或士兵,都需要經過三個步驟,
  • 分別為使用資源、訓練跟產出,這時候我們要怎麼規劃呢?
    Simple Factory-範例

  • Product(產品)
    1
    2
    3
    4
    5
    6
    // 抽象单位
    abstract class Unit {
    public abstract function getMaterial(); // 取得材料
    public abstract function train(); // 訓練
    public abstract function create(); // 產生
    }


  • ConcreteProduct(具体产品角色)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    // 工人
    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;
    }
    }

1
2
3
4
include_once '../../class/pattern/simpleFactory.php';
$building = new CreatBuildCenter(); // 建立生產中心
$solider = $building->outputUnit('solider'); //建立士兵
$worker = $building->outputUnit('worker'); //建立工兵

使用了50單位的水晶、10單位的瓦斯
訓練時間20秒
I am a Solider, Waiting for your order!<br/>

使用了50單位的水晶
訓練時間10秒
I am a Worker, I am ready to work!


Factory Method(工廠方法模式)

Factory Method : UML

  • Product(產品):定義Factory Method所造物件的介面
  • ConcreteProduct(具体产品角色):具體實作出Product介面
  • Creator(創造):宣告Factory Method,它會傳回Product類別之物件
  • ConcreteCreator(具體工廠):複寫Factory Method以傳回ConcreteProduct的物件個體
    Factory Method-UML

Factory Method:模式分析

  • 優點:
    • 有了
  • 缺點:
    • 不論工廠內部

Factory Method:模式分析

  • 使用時機:
    • 當類別
    • 當類

Factory Method:範例

  • 現在除了要生產工人與士兵,還要生產戰鬥機,但是戰鬥機還需要多一個工序:建造,這時候我們要怎麼規劃呢?
    Factory Method-範例

  • Creator

    1
    2
    3
    4
    // 抽象的建築物工廠
    abstract class BuildFactory {
    abstract function outputUnit();
    }
  • ContreteCreator

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    // 指導中心
    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(); // 播放單位口號

    }
  • ConcreteProduct

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    // 工人
    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/>";
    }
    }
1
2
3
4
5
6
7
8
9
10
11
12
include_once '../../class/pattern/factory.php';

$barrack = new Barrack(); // 建立軍營
$solider = $barrack->outputUnit(); // 產生單位
$solider->playSlogan();

$commandCenter = new CommandCenter(); // 建立指揮中心
$worker = $commandCenter->outputUnit(); // 產生單位
$worker->playSlogan();

$airport = new Airport(); // 建立機場
$aircraft = $airport->outputUnit(); // 產生單位

`快給我戰鬥機吧!!

SUV準備好了,長官妳想蓋啥建築呢?

組裝飛機中…
我已經準備好起飛出擊了,長官!`