在程序中,需要創建的對象很多,導致對象的new操作多且雜時,需要使用工廠模式;
由於對象的創建過程是我們不需要去關心的,而我們注重的是對象的實際操作,所以,我們需要分離對象的創建和操作兩部分,如此,方便後期的程序擴展和維護。
工廠模式有一種非常形象的描述,建立對象的類就如一個工廠,而需要被建立的對象就是一個個產品;在工廠中加工產品,使用產品的人,不用在乎產品是如何生產出來的。從軟體開發的角度來說,這樣就有效的降低了模塊之間的耦合。
對於工廠模式,具體上可以分為三類:
簡單工廠模式(factory method pattern):實質是由一個工廠類根據傳入的參數,動態決定應該創建哪一個產品類(這些產品類繼承自一個父類或接口)的實例。
工廠方法模式(factory method pattern):定義了一個創建對象的接口,但由子類決定要實例化的類是哪一個,工廠方法讓類把實例化推遲到子類。
抽象工廠模式(Abstract factory pattern):提供一個接口, 用於創建相關或依賴對象的家族,而不需要指定具體類。
對於上面的三種工廠模式,從上到下逐步抽象,並且更具一般性。這裡講的是簡單工廠模式。
簡單工廠模式又稱為靜態工廠模式,實質是由一個工廠類根據傳入的參數,動態決定應該創建哪一個產品類(這些產品類繼承自一個父類或接口)的實例。
1 簡單工廠模式適用的場合
1.1 工廠類負責創建的對象比較少,由於創建的對象較少,不會造成工廠方法中的業務邏輯太過複雜。
1.2 客戶端只知道傳入工廠類的參數,對於如何創建對象並不關心。
如果客戶端不知道它所需要的對象的類,可以考慮工廠方法模式。
#include <iostream>
#include <vector>
using namespace std;
typedef enum ProductTypeTag
{
TypeA,
TypeB,
TypeC
}PRODUCTTYPE;
// Here is the product class
class Product
{
public:
virtual void Show() = 0;
};
class ProductA : public Product
{
public:
void Show()
{
cout<<"I'm ProductA"<<endl;
}
};
class ProductB : public Product
{
public:
void Show()
{
cout<<"I'm ProductB"<<endl;
}
};
class ProductC : public Product
{
public:
void Show()
{
cout<<"I'm ProductC"<<endl;
}
};
// Here is the Factory class
class Factory
{
public:
Product* CreateProduct(PRODUCTTYPE type)
{
switch (type)
{
case TypeA:
return new ProductA();
case TypeB:
return new ProductB();
case TypeC:
return new ProductC();
default:
return NULL;
}
}
};
int main(int argc, char *argv[])
{
// First, create a factory object
Factory *ProductFactory = new Factory();
Product *productObjA = ProductFactory->CreateProduct(TypeA);
if (productObjA != NULL)
productObjA->Show();
Product *productObjB = ProductFactory->CreateProduct(TypeB);
if (productObjB != NULL)
productObjB->Show();
Product *productObjC = ProductFactory->CreateProduct(TypeC);
if (productObjC != NULL)
productObjC->Show();
delete ProductFactory;
ProductFactory = NULL;
delete productObjA;
productObjA = NULL;
delete productObjB;
productObjB = NULL;
delete productObjC;
productObjC = NULL;
return 0;
}
output:
I'm ProductA
I'm ProductB
I'm ProductC
2 簡單工廠模式的優缺點
2.1 優點:
工廠類是整個模式的關鍵。包含了必要的邏輯判斷,根據外界給定的信息,決定究竟應該創建哪個具體類的對象。
通過使用工廠類,外界可以從直接創建具體產品對象的尷尬局面擺脫出來,僅僅需要負責「消費」對象就可以了。
而不必管這些對象究竟如何創建及如何組織的.明確了各自的職責和權利,有利於整個軟體體系結構的優化。
2.2 缺點:
由於工廠類集中了所有實例的創建邏輯,違反了開閉原則,將全部創建邏輯集中到了一個工廠類中;
它所能創建的類只能是事先考慮到的,如果需要添加新的類,則就需要改變工廠類了。
當系統中的具體產品類不斷增多時候,可能會出現要求工廠類根據不同條件創建不同實例的需求.
這種對條件的判斷和對具體產品類型的判斷交錯在一起,很難避免模塊功能的蔓延,對系統的維護和擴展非常不利;
開閉原則定義:一個軟體實體如類、模塊和函數應該對擴展開放,對修改關閉。
開放-封閉原則的意思就是說,你設計的時候,時刻要考慮,儘量讓這個類是足夠好,寫好了就不要去修改了,如果新需求來,我們增加一些類就完事了,原來的代碼能不動則不動。這個原則有兩個特性,一個是說「對於擴展是開放的」,另一個是說「對於更改是封閉的」。面對需求,對程序的改動是通過增加新代碼進行的,而不是更改現有的代碼。這就是「開放-封閉原則」的精神所在。
3 總結
創建型模式對類的實例化過程進行了抽象,能夠將對象的創建與對象的使用過程分離。簡單工廠模式又稱為靜態工廠方法模式,它屬於類創建型模式。在簡單工廠模式中,可以根據參數的不同返回不同類的實例。
簡單工廠模式專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類。簡單工廠模式包含三個角色:工廠角色負責實現創建所有實例的內部邏輯;抽象產品角色是所創建的所有對象的父類,負責描述所有實例所共有的公共接口;具體產品角色是創建目標,所有創建的對象都充當這個角色的某個具體類的實例。簡單工廠模式的要點在於:當你需要什麼,只需要傳入一個正確的參數,就可以獲取你所需要的對象,而無須知道其創建細節。簡單工廠模式最大的優點在於實現對象的創建和對象的使用分離,將對象的創建交給專門的工廠類負責,但是其最大的缺點在於工廠類不夠靈活,增加新的具體產品需要修改工廠類的判斷邏輯代碼,而且產品較多時,工廠方法代碼將會非常複雜。簡單工廠模式適用情況包括:工廠類負責創建的對象比較少;客戶端只知道傳入工廠類的參數,對於如何創建對象不關心。
ref
https://www.cnblogs.com/ring1992/p/9592569.html
https://www.cnblogs.com/xuwendong/p/9634614.html
-end-