簡單工廠模式
1. 啥時候使用簡單工廠模式
假設你是一家工廠的廠長,有一天,一名客戶找到你,並告訴你幫他生產一部黑色手機,於是你便通知了生產線開始生產黑色手機,生產成功後你將黑色手機交付客戶;又有一名客戶需要你幫他生產銀白色手機,你同樣與生產黑色手機一樣,通知生產線開始生產,成功後並交付客戶。由此可見你不需要知道工廠生產線是如何工作的,只需要知道此工廠的生產指令即可,此時,就可以使用簡單工廠模式。
2. 簡單工廠模式定義
簡單工廠模式(Simple Fctory Pattern):又稱爲靜態工廠方法(Static Factory Method)模式,它屬於類創建模式。在簡單工廠模式中,可以根據參數的不同返回不同類的實例。簡單工廠模式專門定義一個類負責創建其他類的實例,被創建的實例通常都具有共同的父類。
分析:簡單工廠是一個靜態的(當然非靜態也可以),提供一個類型標識(操作指令),可根據不同的標識生產不同的對象,但不同產品對象都在同一個工廠生產,同時不同產品必須源自於相同的對象。
舉個例子:簡單工廠就相當於一個家族,家族當中有很多的子女,但是他們都源自於同一個老祖宗,如果你想找他們幹活,就要通過這個家族,並告訴他,你現在想請誰幫忙幹活。
(我靠 這個有序列表老是給我搗亂,不知道怎麼調整,大家有好的辦法,可以分享下)
3 該模式中包含的角色及其職責
**1)、Factory:工廠角色**
簡單工廠模式的核心,它負責實現創建所有實例的內部邏輯。工廠內創建產品類的方法可被外界直接調用,根據產品標識創建所需的產品對象。
**2)、Product:抽象產品角色**
抽象產品角色是創建的所有對象的父類,負責描述所有實例所共有的公共接口。
**3)、ConcreteProduct:具體產品角色**
具體產品角色是創建目標,所有創建的對象都充當這個角色的某個具體類的實例。
4. 擼代碼分析
PHP代碼哦
/**
* 抽象產品角色:IProduct
*/
interface IProduct
{
/**
* 成員名稱1:method1()
*/
public function method1();
/**
* 成員名稱2:method2()
*/
public function method2();
}
/**
* 具體產品角色:ConcreteProductA
*
*/
class ConcreteProductA implements IProduct
{
/**
* 成員名稱1:method1()
* {@inheritDoc}
* @see \DesignPatterns\Creational\SimpleFactory\IProduct::method1()
*/
public function method1(){
//具體代碼實現
}
/**
* 成員名稱2:method2()
* {@inheritDoc}
* @see \DesignPatterns\Creational\SimpleFactory\IProduct::method2()
*/
public function method2(){
//具體代碼實現
}
}
/**
* 具體產品角色:ConcreteProductB
*
*/
class ConcreteProductB implements IProduct
{
/**
* 成員名稱1:method1()
* {@inheritDoc}
* @see \DesignPatterns\Creational\SimpleFactory\IProduct::method1()
*/
public function method1(){
//具體代碼實現
}
/**
* 成員名稱2:method2()
* {@inheritDoc}
* @see \DesignPatterns\Creational\SimpleFactory\IProduct::method2()
*/
public function method2(){
//具體代碼實現
}
}
/**
1. 工廠角色:Factory
2. */
class Factory
{
/**
* 創建創建方法
* @param int $productSign 產品標識
* @return IProduct 抽象產品角色:IProduct
*/
public static function createProduct($productSign){
if ($productSign === 1){
return new ConcreteProductA();
} elseif ($productSign === 2){
return new ConcreteProductB();
}
}
}
/**
3. 測試簡單工廠
4. */
class TestSimpleFactory
{
/**
* 測試通過簡單工廠創建產品
*/
public function testCreateProduct(){
//創建具體產品角色:ConcreteProductA
$product = Factory::createProduct(1);
}
}
5. 簡單工廠模式的優點
工廠類是整個模式的關鍵,包含了必要的邏輯判斷,根據外界給定的信息,可以決定究竟應該創建哪一種產品類的實例,通過使用工廠類可以免除直接創建產品對象的責任,而僅僅需要負責“消費”產品就可以了。簡單工廠模式實現了對責任的分割,明確了各自的職責和權利,並提供了專門的工廠類用於創建對象。
使用者不需要關心具體產品類的類名稱,只需要知道具體產品類所對應的產品標識參數即可,對於複雜的類名稱,通過簡單工廠模式可以便於使用者記憶。
通過配置文件,可以在不修改任何使用者代碼的情況下更換具體產品類
6. 簡單工廠模式的缺點
由於工廠類集中了所有產品創建邏輯,一旦不能正常工作,則整個系統都要崩潰 。
如果需要添加新的類,則不得不修改工廠邏輯,在產品類型較多時,有可能造成工廠邏輯過於複雜,不利於系統的擴展和維護。
7. 使用場景
以下情況可以使用簡單工廠模式:
工廠類負責創建的對象比較少;創建對象比較少,不會造成工廠方法中業務邏輯太過複雜。
使用者只知道傳入工廠類的參數,對於如何創建對象(邏輯)不關心。
注:由於簡單工廠很容易違反高內聚責任分配原則,因此一般只在很簡單的情況下應用。
名詞解釋:
高內聚:是指一個軟件模塊是由相關性很強的代碼組成,只負責一項任務,也就是常說的單一責任原則。
8. 總結
簡單工廠模式有一個靜態方法可供外部調用
創建對象與使用對象分離
所有被創建者都源自於一個老祖宗(基類)
根據傳入的不同參數返回不同類型的實例
簡單工廠模式都有三個角色組成,分別是工廠角色負責創建所有實例的內部邏輯;抽象產品角色是所有創建對象的基類,並負責描述共有的公共接口;具體產品角色創建目標,是具體產品角色的具體類的實例。
負責創建的對象比較少;使用者只需要關心工廠類的參數,對於如何創建對象(邏輯)不關心。