工廠模式(Factory pattern)和單例模式一樣,是另外一種創建型模式。和單例模式不同的是,單例模式會創建和管理一個單獨的類型的單一對象,工廠模式則是用於創建多種不同類型的類的多個對象。 ...
工廠模式(Factory pattern)和單例模式一樣,是另外一種創建型模式。
和單例模式不同的是,單例模式會創建和管理一個單獨的類型的單一對象,工廠模式則是用於創建多種不同類型的類的多個對象。
工廠模式的實現
簡單的工廠模式由三部分組成:
- 抽象基類:類中定義抽象一些方法,用以在子類中實現;
- 繼承自抽象基類的子類:實現基類中的抽象方法;
- 工廠類:用以實例化對象。
下麵來一步步實現一個簡單的工廠模式程式。
首先要定義一個抽象基類:
// 定義抽象基類 abstract class People{ // 定義抽象方法 abstract public function work(); }
增加多個基類的實現:
class Coder extends People{ public function work("程式員的工作是寫代碼"); } class Teacher extends People{ public function work("老師的工作是教書育人"); } class Cook extends People{ public function work("廚師的工作是做美味的菜餚"); }
定義工廠類,用於實現創建不同對象的需求:
//工廠類 Class Factory{ //此方法根據參數創建需要的對象 static function createInstance($job){ $job = ucfirst($job); return new $job; } }
現在,可以運行代碼試試:
$p = Factory::createInstance("Teacher"); $p->work(); // 程式輸出:老師的工作是教書育人 $m = Factory::createInstance("Coder"); $m->work(); // 程式輸出:程式員的工作是寫代碼 $w = Factory::createInstance("Cook"); $w->work(); // 程式輸出:廚師的工作是做美味的菜餚
或者,可以這樣修改基類:
// 定義抽象基類 abstract class People{ // 定義抽象方法 abstract public function work(); /*######################################*/ //定義工廠方法,並使其不可繼承 static final function createInstance($job){ $job = ucfirst($job); return new $job; } /*######################################*/ }
此時,可以這樣創建對象:
$p = People::createInstance("Teacher"); $p->work(); // 程式輸出:老師的工作是教書育人
工廠模式的優點及使用場景
優點:降低了程式的耦合度,方便日後的維護及擴展。
使用場景:
1.當程式編寫的時候,並不能確定在生成對象的時候其確切的對象類型,只有到程式運行的時候才會確定。
2.在不確定會有多少個處理操作的時候,如針對接收到的數據,處理的邏輯可能會不同,可能以後還會增加新的操作。