簡單工廠模式和工廠模式 要求 同一類型的產品子類擁有共同的方法,這限制了產品子類的擴展。抽象工廠可以向客戶端提供一個接口,是客戶端在不必指定產品的具體情況下,創建多個產品族中的產品對象。抽象工廠中將同一類的產品子類歸為一類,讓它們繼承同一個抽象子類,將一個抽象子類的具體產品子類視為一組。產品族是指位於不同產品等級結構中,功能相關聯的產品組成的家族。一般位於不同等級結構的相同位置上。每一個產品族中的產品數量與產品等級結構的數量相同。用戶通過工廠以及族來判斷
當用戶使用時,必須知道哪個工廠以及哪個產品族的產品類,即通過組和族的二維坐標來確定具體的產品子類。每個工廠子類負責一族產品,且有一個方法來生成一種類型的產品。
舉個例子說明。對於抽象工廠基類AbstractFactory派生了 3個具體的工廠類Factory1,Factory2,Factory3,則族數為3,即每個抽象產品類有3個具體子類。若有 2 個抽象產品類AbstractProductA,AbstractProductB,即2個組,則工廠類中有2個創建對象的函數createProductA,createProductB。
簡單的實現:
class AbstractProductA{ public: virtual void fun() = 0; AbstractProductA(){} virtual ~AbstractProductA(){} }; class ProductA_1 : public AbstractProductA{ public: virtual void fun(){cout<< "A_1"<抽象工廠的用處,其原始意義是為了UNIX 和Windows,兩者許多操作是相同的,這些相同的對象如File,Button等,這些東西分別為Windows族和Unix族各有一份,而對File這樣對象的工廠類稱Unixfile和Windowsfile為一組,進行結構化的劃分。
抽象工廠支持不同類型的產品,更加方便的使用同一族中間的不同類型的產品。增加一族產品時,不修改工廠類和產品類的接口,不違背開閉原則。
缺點:結構過於臃腫,即使我只是簡單實現,而3x2,就寫了以上如此多的代碼。如果產品組數變多或族數增加,都會使其難以管理。每次增加一組產品,工廠類和產品類接口都要修改,違背開閉原則。