CleanMyMac

Singleton Pattern,PHP 單例模式

Feature image for Singleton Pattern,PHP 單例模式

簡介

在這篇文章中將深入探討 Singleton Pattern(單例模式)在 PHP 中的實作和應用。我們會從基礎概念開始,然後透過一個以咖啡為主題的實際範例來說明如何使用 Singleton Pattern。文章的目的是讓讀者不僅了解 Singleton Pattern 的理論,還能掌握其實際應用。

什麼是 Singleton Pattern

Singleton Pattern 是一種設計模式,用於確保一個類別只有一個實例,並提供一個全域存取點來存取它。

這是一個基本的 Singleton Pattern 的類別圖:

想像您走進一家咖啡店,這家咖啡店只有一台咖啡機。不論有多少人來買咖啡,都必須使用這台唯一的咖啡機。這台咖啡機就像是一個 Singleton,所有人都使用同一個實例。

什麼狀況適合使用 Singleton Pattern

在許多情境下,我們需要確保某個類別只有一個實例。例如,如果您有一個用於管理資料庫連線的類別,則通常只需要一個資料庫連線,而不是每次需要時都建立一個新的連線。這樣可以節省資源,提高效能。Singleton Pattern 就是為這種需求而生的。

範例教學

這個範例會以咖啡為主題來說明如何使用 Singleton Pattern。

原始範例,未使用 Singleton

這裡先建立一個 CoffeeMaker 類別,但不使用 Singleton Pattern。

<?php
class CoffeeMaker {
    public function brew() {
        echo "Brewing coffee...\n";
    }
}

// 建立多個 CoffeeMaker 實例
$coffeeMaker1 = new CoffeeMaker();
$coffeeMaker2 = new CoffeeMaker();

$coffeeMaker1->brew();
$coffeeMaker2->brew();
?>

缺點

  1. 資源浪費:每次都會建立一個新的 CoffeeMaker 實例。
  2. 無法控制:無法確保只有一個 CoffeeMaker 實例。

改善範例,使用 Singleton

接下來,我們將使用 Singleton Pattern 來改進 CoffeeMaker 類別。

<?php
class CoffeeMaker {
    private static $instance;

    private function __construct() {
        // 私有建構函數以防止外部建立實例
    }

    public static function getInstance() {
        if (self::$instance === null) {
            self::$instance = new CoffeeMaker();
        }
        return self::$instance;
    }

    public function brew() {
        echo "Brewing coffee...\n";
    }
}

// 使用 Singleton 實例
$coffeeMaker1 = CoffeeMaker::getInstance();
$coffeeMaker2 = CoffeeMaker::getInstance();

$coffeeMaker1->brew();
$coffeeMaker2->brew();
?>

優點

  1. 資源節省:確保只有一個 CoffeeMaker 實例。
  2. 全域存取:可以從任何地方存取這個單一實例。

更多延伸範例

在這個延伸範例中,將新增一個 clean() 方法來清潔咖啡機。

<?php
class CoffeeMaker {
    // ... (其他程式碼不變)

    public function clean() {
        echo "Cleaning the coffee machine...\n";
    }
}

// 使用 Singleton 實例
$coffeeMaker = CoffeeMaker::getInstance();
$coffeeMaker->brew();
$coffeeMaker->clean();
?>

這樣,我們就可以輕鬆的只清潔一台咖啡機,而不用清潔一大堆咖啡機。

其他類似的 Design Pattern

除了 Singleton Pattern,還有其他一些設計模式也可以用於管理資源和實例,例如 Factory Pattern 和 Builder Pattern。這些模式各有其用途和優缺點。Factory Pattern 適用於需要建立多種類型的物件時,而 Builder Pattern 則適用於需要逐步建置物件的情況。

Design Pattern主要用途優點缺點
Singleton管理單一實例資源節省可能造成全域狀態
Factory建立多種物件靈活性高複雜性增加
Builder逐步建置物件易於維護需要更多的類別和方法

參考來源

  1. Singleton Pattern – Wikipedia
  2. PHP Object-Oriented Programming