PHP設計模式之工廠模式

Master_Kang發表於2020-11-04

概念:

工廠設計模式提供獲取某個物件的新例項的一個介面,同時使呼叫程式碼避免確定實際例項化基類步驟。 很多高階模式都是依賴於工廠模式。

好處:

PHP中能夠建立基於變數內容的類的新例項,減少主程式碼流中的基於條件複雜性; 同時如果類發生改變不需要所有的地方進行修改,只需要在工廠中進行修改 (無論物件被修改或者新增其他物件,Factory物件呼叫方式仍讓是相同的)

注意重點: 工廠模式簡單可以理解為,把new一個物件的寫法,寫成呼叫靜態方法的方式去建立物件!或者更簡單說是封裝new,使用介面強制實現工廠介面方式,優點:靜態呼叫,方便改變子工廠類名,缺點:多次使用new,解決方案:可以結合單例模式進行單次呼叫

一、什麼是工廠模式?

  一個類透過本身的靜態方法來,例項化一個類並返回一個例項物件;

二、工廠模式特點?

  類命名特點:nameFactory eg: class mysqlFactory{} 【這是為了規範,當然也去起其他任意名字】

  靜態方法名稱:static public function factory($class_name){} 【靜態方法是類與外界的介面, 返回的是一個物件】

三、優點?

  如果已經使用的類內部發生改變,哪不需要在所有的地方都改變,只需要在類工廠類裡改變既可,

   比如:連線資料庫,可以使用mysql 、mysqli、pdo,根據不同引數配置使用不同的資料庫操作類

四、應用場景

做支付介面的時候,未來可能對應不同的支付閘道器:支付寶、財付通、網銀線上等。
方便未來擴充套件,設計成工廠模式。定一個專門生產閘道器介面的工廠,抽象出來,
做成介面形式,讓所有的子類都要實現它的介面。
以後加一個支付方式,要使用哪一種支付方式,改變一下引數即可。

在為使用者註冊的時候,分為很多種角色的使用者。
比如冊使用者,匿名使用者、管理員使用者等。完全使用可以使用工廠的思想來實現,
程式碼也容易維護,為每種角色可以生成操作的類等等。

系統對接多個不同型別的資料庫,mysql,oracle,sqlserver

<?php
/**
 * 抽象工廠角色
 */
interface Creator {
    public function factoryMethod();
}

/**
 * 具體工廠角色A
 */
class ConcreteCreatorA implements Creator {
    /**
     * 工廠方法 返回具體 產品A
     * @return ConcreteProductA
     */
    public function factoryMethod() {
        return new ConcreteProductA();
    }
}

/**
 * 具體工廠角色B
 */
class ConcreteCreatorB implements Creator {
    /**
     * 工廠方法 返回具體 產品B
     * @return ConcreteProductB
     */
    public function factoryMethod() {
        return new ConcreteProductB();
    }
}

/**
 * 抽象產品角色(定義要子工廠實現的方法)
 */
interface Product {
    public function operation();
}

/**
 * 具體產品角色A
 */
class ConcreteProductA implements Product {
    /**
     * 介面方法實現 輸出特定字串
     */
    public function operation() {
        echo 'ConcreteProductA <br />';
    }
}

/**
 * 具體產品角色B
 */
class ConcreteProductB implements Product {
    /**
     * 介面方法實現 輸出特定字串
     */
    public function operation() {
        echo 'ConcreteProductB <br />';
    }
}

class Client {
    /**
     * Main program.
     */
    public static function main() {
        $creatorA = new ConcreteCreatorA();
        $productA = $creatorA->factoryMethod();
        $productA->operation();

        $creatorB = new ConcreteCreatorB();
        $productB = $creatorB->factoryMethod();
        $productB->operation();
    }

}

Client::main();
?>

【工廠方法模式與簡單工廠模式】
工廠方法模式與簡單工廠模式再結構上的不同不是很明顯。
工廠方法類的核心是一個抽象工廠類,而簡單工廠模式把核心放在一個具體類上。
工廠方法模式之所以有一個別名叫多型性工廠模式是因為具體工廠類都有共同的介面,或者有共同的抽象父類。
當系統擴充套件需要新增新的產品物件時,僅僅需要新增一個具體物件以及一個具體工廠物件,原有工廠物件不需要進行任何修改,也不需要修改客戶端,很好的符合了”開放-封閉”原則。而簡單工廠模式在新增新產品物件後不得不修改工廠方法,擴充套件性不好。
工廠方法模式退化後可以演變成簡單工廠模式。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章