抽象工廠模式的小結

前陣子軟件體系結構的課上學習了簡單工廠模式與工廠模式,雖然能瞭解課程內容,但到了抽象工廠模式的時候理解起來就有點問題了,在這裏對其抽象工廠模式的特點做一些小結。

首先給出抽象工廠模式的定義:抽象工廠模式是所有形態的工廠模式中最爲抽象和最具一般性的一種形態。抽象工廠模式是指當有多個抽象角色時,使用的一種工廠模式。抽象工廠模式可以向客戶端提供一個接口,使客戶端在不必指定產品的具體的情況下,創建多個產品族中的產品對象。根據LSP原則,任何接受父類型的地方,都應當能夠接受子類型。因此,實際上系統所需要的,僅僅是類型與這些抽象產品角色相同的一些實例,而不是這些抽象產品的實例。換言之,也就是這些抽象產品的具體子類的實例。工廠類負責創建抽象產品的具體子類的實例。

在此,引進一個概念,產品族。產品族是指位於不同產品等級結構中,功能相關聯的產品組成的家族。當有多個不同的等級結構的產品時,如果使用工廠方法模式就勢必要使用多個獨立的工廠等級結構來對付這些產品的等級結構。如果這些產品等級結構是平行的,會導致多個平行的工廠等級結構。抽象工廠模式使用同一個 工廠等級結構負責這些不同產品等級結構產品對象的創建。對於每一個產品族,都有一個具體工廠。而每一個具體工廠創建屬於同一個產品族,但是分屬於不同等級結構的產品。通過引進抽象工廠模式,可以處理具有相同(或者相似)等級結構的多個產品族中的產品對象的創建問題。由於每個具體工廠角色都需要負責兩個不同等級結構的產品對象的創建,因此每個工廠角色都需要提供兩個工廠方法,分別用於創建兩個等級結構的產品。既然每個具體工廠角色都需要實現這兩個工廠方法,所以具有一般性,不妨抽象出來,移動到抽象工廠角色中加以聲明。

下面看看抽象工廠模式類型的代碼構成

public interface Creator{

public ProductA factoryA();

public ProductB factoryB();

}

具體工廠

類別一:

public class ConcreteCreator1 implements Creator{

public ProductA factoryA(){

return new ProductA1();

}

public ProductB factoryB(){

return new ProductB1();

}

}

類別二:

public class ConcreteCreator2 implements Creator{

public ProductA factoryA(){

return new ProductA2();

}

public ProductB factoryB(){

return new ProductB2();

}

}

一般而言,有多少個產品等級結構,就會在工廠角色中發現多少個工廠方法。每一個產品等級結構中有多少個具體的產品,就有多少個產品族,也就會在工廠等級結構中發現多少個具體工廠。

抽象產品

類別A

public interface ProductA

{

}

類別B

public interface ProductB

{

}

具體產品類

ProdcutA1:

public class ProductA1 implements ProductA

{

public ProductA1()

{

}

}

ProdcutA2

public class ProductA2 implements ProductA

{

public ProductA2()

{

}

}:

ProdcutA1:

public class ProductB1 implements ProductB

{

public ProductB1()

{

}

}

public class ProductB2 implements ProductB

{

public ProductB2()

{

}

}

在真實的系統中,產品等級結構的數目與每個產品等級結構中產品的數目(產品族)一般是不相等的。

 

 

此模式的特點:

優點:

1.它分離了具體的類

2.它使得易於交換產品系列

3.它有利於產品的一致性

缺點:

難以支持新種類的產品

 

在以下情況下應當考慮使用抽象工廠模式:

1.一個系統不應當依賴於產品類實例如何被創建、組合和表達的細節,這對於所有形態的工廠模式都是重要的。

2.這個系統有多於一個的產品族,而系統只消費其中某一產品族。

3.同屬於同一個產品族的產品是在一起使用的,這一約束必須在系統的設計中體現出來。

4.系統提供一個產品類的庫,所有的產品以同樣的接口出現,從而使客戶端不依賴於實現

"開放-封閉"原則

"開放-封閉"原則要求系統對擴展開放,對修改封閉。通過擴展達到增強其功能的目的。對於涉及到多個產品族與多個產品等級結構的系統,其功能增強包括兩方面:

增加產品族:Abstract Factory很好的支持了"開放-封閉"原則。

增加新產品的等級結構:需要修改所有的工廠角色,沒有很好支持"開放-封閉"原則。

綜合起來,抽象工廠模式以一種傾斜的方式支持增加新的產品,它爲新產品族的增加提供方便,而不能爲新的產品等級結構的增加提供這樣的方便。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章