簡單工廠(Simple Factory)

我們如果想要煮東西給自己吃,我們需要自己「準備食材」、「烹煮食材」、「上菜」

<?php
/**
 * 抽象"烹煮"類別
 */
abstract class Cook {
    // 準備食材
    public abstract function prepareIngredient();
    // 烹煮食材
    public abstract function cooking();
    // 上菜
    public abstract function serve(); 
}
?>

假如我們想要吃咖哩,我們會這樣做:

<?php
/**
 * 咖哩
 */
class Curry extends Cook
{   
    // 準備食材
    public function prepareIngredient()
    {
        echo "準備「馬鈴薯」、「蘿蔔」、「洋蔥」、「肉」\n";
    }

    // 烹煮食材
    public function cooking()
    {
        echo "下鍋炒肉,等肉熟之後,將「馬鈴薯」、「蘿蔔」、「洋蔥」加到鍋裡並加滿水,等水滾加入咖哩塊悶熟即可\n";
    }

    // 上菜
    public function serve()
    {
        echo "盤子放上白飯,將咖哩淋在白飯周圍即可\n";
    }
}

$curry = new Curry;
$curry->prepareIngredient();    // 準備食材
$curry->cooking();              // 烹煮食材
$curry->serve();                // 上菜
?>

我們會得到這樣的結果:

準備「馬鈴薯」、「蘿蔔」、「洋蔥」、「肉」
下鍋炒肉,等肉熟之後,將「馬鈴薯」、「蘿蔔」、「洋蔥」加到鍋裡並加滿水,等水滾加入咖哩塊悶熟即可
盤子放上白飯,將咖哩淋在白飯周圍即可

假如我們想要吃三明治,我們會這樣做:

<?php
/**
 * 三明治
 */
class Sandwich extends Cook
{
    // 準備食材
    public function prepareIngredient()
    {
        echo "準備「吐司」、「生菜」、「小黃瓜」、「蛋」、「肉」\n";
    }

    // 烹煮食材
    public function cooking()
    {
        echo "將蛋及肉煎熟、生菜及小黃瓜切絲,平均放在烤好的土司上夾起來\n";
    }

    // 上菜
    public function serve()
    {
        echo "吐司對切放在盤子上即可\n";
    }
}

$sandwich = new Sandwich;
$sandwich->prepareIngredient();
$sandwich->cooking();
$sandwich->serve();
?>

我們會得到這樣的結果:

準備「吐司」、「生菜」、「小黃瓜」、「蛋」、「肉」
將蛋及肉煎熟、生菜及小黃瓜切絲,平均放在烤好的土司上夾起來
吐司對切放在盤子上即可

所有我們想要吃的東西,我們通通都需要經過一樣的步驟(「準備食材」、「烹煮食材」、「上菜」)去達成,因為每次想要吃個東西都需要時間來做這些菜,假如我們比較沒有時間,想要到外面餐廳去用餐,我們會這樣做:

<?php
// 到餐廳用餐
$restaurant = new Restaurant;
// 點餐:咖哩
$restaurant->order('curry');
// 點餐:三明治
$restaurant->order('sandwich');
?>

所以我們需要餐廳來讓我們有這些食物可以吃,所以我們有了餐廳:

<?php
/**
 * 餐廳
 */
class Restaurant
{
    public function order($meal)
    {
        // 透過廚師工廠,聘請會煮這道餐點的廚師
        $chef = ChefFactory::hireChef($meal);

        // 烹煮食物
        $chef->prepareIngredient();
        $chef->cooking();
        $chef->serve();
    }
}
?>

餐廳會提供他們的餐點讓我們點,而他們的餐點需要特定的廚師才會烹煮,所以當客人點了餐,餐廳會透過「廚師工廠」聘請該廚師去烹煮餐點:

<?php
/**
 * 廚師工廠
 */
class ChefFactory
{
    /**
     * 聘請廚師
     */
    public static function hireChef($meal)
    {
        switch ($meal) {
            // 咖哩廚師
            case 'curry':
                return new Curry();
                break;
            // 三明治廚師
            case 'sandwich':
                return new Sandwich();
                break;
        }
    }
}
?>

我們會得到這樣的結果:

準備「馬鈴薯」、「蘿蔔」、「洋蔥」、「肉」
下鍋炒肉,等肉熟之後,將「馬鈴薯」、「蘿蔔」、「洋蔥」加到鍋裡並加滿水,等水滾加入咖哩塊悶熟即可
盤子放上白飯,將咖哩淋在白飯周圍即可

準備「吐司」、「生菜」、「小黃瓜」、「蛋」、「肉」
將蛋及肉煎熟、生菜及小黃瓜切絲,平均放在烤好的土司上夾起來
吐司對切放在盤子上即可

這樣我們就可以把烹煮這個重複且繁瑣的工作,交給餐廳及廚師工廠去處理,以後我們只要負責點餐就好了!

點選下載範例檔案