發現工廠方法模式存在乙個嚴重的問題:
而在實際過程中,乙個工廠往往需要生產多類產品。為了解決上述的問題,我們又使用了一種新的設計模式:抽象工廠模式。
抽象工廠模式.jpg
1.1 定義
抽象工廠模式,即abstract factory pattern,提供乙個建立一系列相關或相互依賴物件的介面,而無須指定它們具體的類;具體的工廠負責實現具體的產品例項。
抽象工廠模式與工廠方法模式最大的區別:抽象工廠中每個工廠可以建立多種類的產品;而工廠方法每個工廠只能建立一類1.2 主要作用
允許使用抽象的介面來建立一組相關產品,而不需要知道或關心實際生產出的具體產品是什麼,這樣就可以從具體產品中被解耦。
1.3 解決的問題
每個工廠只能建立一類產品
即工廠方法模式的缺點2.1 uml類圖
uml類圖
2.2 模式組成
組成(角色)
關係作用
抽象產品族(abstractproduct)
抽象產品的父類
描述抽象產品的公共介面
抽象產品(product)
具體產品的父類
描述具體產品的公共介面
具體產品(concrete product)
抽象產品的子類;工廠類建立的目標類
描述生產的具體產品
抽象工廠(creator)
具體工廠的父類
描述具體工廠的公共介面
具體工廠(concrete creator)
抽象工廠的子類;被外界呼叫
描述具體工廠;實現factorymethod工廠方法建立產品的例項
如何理解抽象產品族、抽象產品和具體產品的區別呢?請看下圖
概念區別.jpg
2.3 使用步驟
步驟1:建立抽象工廠類,定義具體工廠的公共介面;
步驟2:建立抽象產品族類,定義抽象產品的公共介面;
步驟3:建立抽象產品類(繼承抽象產品族類),定義具體產品的公共介面;
步驟4:建立具體產品類(繼承抽象產品類) & 定義生產的具體產品;
步驟5:建立具體工廠類(繼承抽象工廠類),定義建立對應具體產品例項的方法;
步驟6:客戶端通過例項化具體的工廠類,並呼叫其建立不同目標產品的方法建立不同具體產品類的例項
接下來我用乙個例項來對抽象工廠模式進行更深一步的介紹。
3.1 例項概況
即抽象工廠模式3.2 使用步驟
步驟1:建立抽象工廠類,定義具體工廠的公共介面
abstract class factory
步驟2:建立抽象產品族類,定義具體產品的公共介面;
abstract class abstractproduct
步驟3:建立抽象產品類,定義具體產品的公共介面;
//容器產品抽象類
abstract class containerproduct extends abstractproduct
//模具產品抽象類
abstract class mouldproduct extends abstractproduct
步驟4:建立具體產品類(繼承抽象產品類), 定義生產的具體產品;
//容器產品a類
class containerproducta extends containerproduct
}//容器產品b類
class containerproductb extends containerproduct
}//模具產品a類
class mouldproducta extends mouldproduct
}//模具產品b類
class mouldproductb extends mouldproduct
}
步驟5:建立具體工廠類(繼承抽象工廠類),定義建立對應具體產品例項的方法;
//a廠 - 生產模具+容器產品
class factorya extends factory
@override
public product manufacturemould()
}//b廠 - 生產模具+容器產品
class factoryb extends factory
@override
public product manufacturemould()
}
步驟6:客戶端通過例項化具體的工廠類,並呼叫其建立不同目標產品的方法建立不同具體產品類的例項
//生產工作流程
public class abstractfactorypattern
}
結果:
生產出了容器產品a
生產出了容器產品b
生產出了模具產品a
生產出了模具產品b
簡單工廠模式需要修改工廠類的判斷邏輯
簡單工廠中的工廠類存在複雜的switch邏輯判斷
簡單工廠模式的工廠類使用靜態工廠方法抽象工廠模式很難支援新種類產品的變化。
這是因為抽象工廠介面中已經確定了可以被建立的產品集合,如果需要新增新產品,此時就必須去修改抽象工廠的介面,這樣就涉及到抽象工廠類的以及所有子類的改變,這樣也就違背了「開發——封閉」原則。
對於新的產品族符合開-閉原則;對於新的產品種類不符合開-閉原則,這一特性稱為開-閉原則的傾斜性。在了解了優缺點後,我總結了工廠方法模式的應用場景:
設計模式 工廠模式 抽象工廠模式
建立物件時不會對客戶暴露建立邏輯,並且通過使用乙個共同的介面來指向建立的物件。sept1 建立乙個公共介面,將要對外開放的方法在這裡定義。sept2 建立實現介面的類,用即實現對外開放的類的方法 sept3 建立工廠,提供乙個get方法,這個方法提供返回實現類的物件 建立選擇 sept4 使用,建立...
抽象工廠模式 常用設計模式 抽象工廠模式
提供乙個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類。在工廠方法模式中,我們的具體建立者每次使用都只能建立乙個同型別的物件,假如我們現在需要的是多個不同型別的物件,工廠方法就滿足不了需求了。這時我們可以把多個工廠方法組合到乙個類,這就是抽象工廠模式,它就是專門用來建立多個產品,也可以說...
抽象工廠模式 設計模式(九) 抽象工廠模式
提供乙個為建立一組相關或相互依賴物件的介面,且無須指定它們的具體類。它屬於建立型模式。在抽象工廠模式中,每個具體工廠都提供了多個用於建立多種不同型別具體物件的方法,這些不同型別的物件都存在乙個共同的屬性,構成乙個族。上篇文章設計模式 八 工廠方法模式說到工廠方法模式中只考慮某一類產品的生產,例如可樂...