設計模式01--簡單工廠模式(Simple Factory)

一、簡介

工廠模式是最常用的一類創建型設計模式,通常我們所說的工廠模式是指工廠方法模式,它也是使用頻率最高的工廠模式。本章將要學習的簡單工廠模式是工廠方法模式的簡潔版,它不屬於GoF 23種設計模式,但在軟件開發中應用也較爲頻繁,通常將它作爲學習其他工廠模式的入門,它的設計思想很簡單。

因爲在簡單工廠模式中用於創建實例的方法是靜態(static)方法,因此簡單工廠模式又被稱爲靜態工廠方法(Static Factory Method)模式。

二、類結構

簡單工廠模式結構如下:

角色 類別 簡述
Product 產品類 一般是一個抽象類或是接口
ConcreteProduct 具體的產品類 實現或是繼承 Product
Factory 工廠類 用來創建具體的產品
  • Product(抽象產品類):它是工廠類所創建的所有對象的父類,封裝了各種產品對象的公有方法,它的引入將提高系統的靈活性,使得在工廠類中只需定義一個通用的工廠方法,因爲所有創建的具體產品對象都是其子類對象。
  • ConcreteProduct(具體產品類):它是簡單工廠模式的創建目標,所有被創建的對象都充當這個角色的某個具體類的實例。每一個具體產品角色都繼承了抽象產品角色,需要實現在抽象產品中聲明的抽象方法。
  • Factory(工廠類):工廠角色即工廠類,它是簡單工廠模式的核心,負責實現創建所有產品實例的內部邏輯;工廠類可以被外界直接調用,創建所需的產品對象;在工廠類中提供了靜態的工廠方法factoryMethod(),它的返回類型爲抽象產品類型Product。

三、UML圖

比如,我們有一些類,它們都繼承自交通工具類:

四、類實現

1、產品類

interface Vehicle
{
    public function drive();
}

2、具體的產品類

class Car implements Vehicle
{
    public function drive()
    {
        echo '汽車靠四個輪子滾動行走。';
    }
}

class Ship implements Vehicle
{
    public function drive()
    {
        echo '輪船靠螺旋槳划水前進。';
    }
}

class Aircraft implements Vehicle
{
    public function drive()
    {
        echo '飛機靠螺旋槳和機翼的升力飛行。';
    }
}

3、工廠類

簡單工廠模式的要點在於:當你需要什麼,只需要傳入一個正確的參數,就可以獲取你所需要的對象,而無須知道其創建細節。簡單工廠模式結構比較簡單,其核心是工廠類的設計。

class VehicleFactory
{
    public static function build($className = null)
    {
        $className = ucfirst($className);
        if ($className && class_exists($className)) {
            return new $className();
        }
        return null;
    }
}

4、使用案例

工廠類用了一個靜態方法來創建其他類,在客戶端中就可以這樣使用:

VehicleFactory::build('Car')->drive();
VehicleFactory::build('Ship')->drive();
VehicleFactory::build('Aircraft')->drive();

省去了每次都要new類的工作。

五、其它

1、優點

  • 實現起來非常簡單,也充分利用了多態機制
  • 解耦「使調用端不再創建對象,而是交給工廠去創建」,並且對內部實現屏蔽「調用端不需要知道具體實現」
  • 分工明確,並且能更好的體現出代碼含義

2、缺點

  • 由於工廠類集中了所有產品的創建邏輯,職責過重,一旦不能正常工作,整個系統都要受到影響。
  • 系統擴展困難,一旦添加新產品就不得不修改工廠邏輯,在產品類型較多時,有可能造成工廠邏輯過於複雜,不利於系統的擴展和維護。
  • 簡單工廠模式由於使用了靜態工廠方法,造成工廠角色無法形成基於繼承的等級結構。

3、適用場景

在以下情況下可以考慮使用簡單工廠模式:

  • 工廠類負責創建的對象比較少,由於創建的對象較少,不會造成工廠方法中的業務邏輯太過複雜。
  • 客戶端只知道傳入工廠類的參數,對於如何創建對象並不關心。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章