一、簡介
工廠模式是最常用的一類創建型設計模式,通常我們所說的工廠模式是指工廠方法模式,它也是使用頻率最高的工廠模式。本章將要學習的簡單工廠模式是工廠方法模式的簡潔版,它不屬於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、適用場景
在以下情況下可以考慮使用簡單工廠模式:
- 工廠類負責創建的對象比較少,由於創建的對象較少,不會造成工廠方法中的業務邏輯太過複雜。
- 客戶端只知道傳入工廠類的參數,對於如何創建對象並不關心。