一、意圖
定義一個用於創建對象的接口,讓子類決定實例化哪一個類。Factory Method使用一個類的實例化延遲到其子類【GOF95】
二、工廠模式結構圖

三、工廠模式中主要角色
抽象產品(Product)角色:具體產品對象共有的父類或接口
具體產品(Concrete Product)角色:實現抽象產品角色所定義的接口,並且工廠方法模式所創建的每一個對象都是某具體產品對象的實例
抽象工廠(Creator)角色:模式中任何創建對象的工廠類都要實現這個接口,它聲明了工廠方法,該方法返回一個Product類型的對象。
Creator也可以定義一個工廠方法的缺省實現,它返回一個缺省的的ConcreteProduct對象
具體工廠(Concrete Creator)角色:實現抽象工廠接口,具體工廠角色與應用邏輯相關,由應用程序直接調用以創建產品對象。
四、工廠模式的優點和缺點
工廠模式的優點:
工廠方法模式可以允許系統在不修改工廠角色的情況下引進新產品。
工廠模式的缺點:
客戶可能僅僅為了創建一個特定的ConcreteProduct對象,就不得不創建一個Creator子類
五、工廠模式適用場景
1、當一個類不知道它所必須創建的對象的類的時候
2、當一個類希望由它的子類來指定它所創建的對象的時候
3、當類將創建對象的職責委托給多個幫助子類的某一個,並且你希望將哪一個幫助子類是代理者這一信息局部化的時候
六、工廠模式與其它模式
抽象工廠模式(abstract factory模式):Abstract Factory模式經常使用工廠方法來實現
Template Method模式: 工廠方法通常在Template Methods中被調用
七、工廠模式PHP示例
<?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();
?>
八、區分工廠方法模式與簡單工廠模式
工廠方法模式與簡單工廠模式再結構上的不同不是很明顯。工廠方法類的核心是一個抽象工廠類,而簡單工廠模式把核心放在一個具體類上。
工廠方法模式之所以有一個別名叫多態性工廠模式是因為具體工廠類都有共同的接口,或者有共同的抽象父類。
當系統擴展需要添加新的產品對象時,僅僅需要添加一個具體對象以及一個具體工廠對象,原有工廠對象不需要進行任何修改,也不需要修改客戶端,很好的符合了”開放-封閉”原則。而簡單工廠模式在添加新產品對象後不得不修改工廠方法,擴展性不好。
工廠方法模式退化後可以演變成簡單工廠模式。
以上就是使用php實現工廠模式的代碼,還有一些關於工廠模式的概念區分,希望對大家的學習有所幫助。