抽象工廠模式(abstract factory):為建立一組相關或者互相依賴的物件提供乙個介面,而無需指定它們對應的具體類。
通用類圖如下:
例如,我們現在有兩種產品a
和b,而產品a和
b分別都有兩個廠商1和
2進行生產,在這裡我們把不同的廠商
1、廠商
2理解為牌子
1和牌子
2,那麼廠商
1就生產a1、
b1,廠商2生產
a2、b2。
此時,不同的廠商肯定要生產自己的產品(如
a1、b1
),每個廠商都有自己的一系列產品,這就與上面抽象工廠模式的描述類似了。
該例子的類圖如下:
具體**實現如下:
//定義不同的產品之間的一定具備的標準,用inte***ce實現
//其中的method()方法可看作提取出不同產品的共性,如手機都有類似的功能
inte***ce iproducta
inte***ce iproductb
//實現了產品標準實現的一系列具體產品
//由於已經設計好a1由廠商1生產,故以下輸出**有「廠商x」
class producta1 implements iproducta
}class producta2 implements iproducta
}class productb1 implements iproductb
}class productb2 implements iproductb
}
//每一種牌子的產品生產工廠,即不同的廠商負責自己牌子產品的生產
abstract class factory1
abstract class factory2
//具體的工廠用來生產相關的產品
class concretefactory1 extends factory1
public iproductb getproductb1()
}class concretefactoryb extends factory2
public iproductb getproductb2()
}
//測試類
public class client
}
執行結果:
廠商1 生產producta1 ...
廠商1 生產productb1 ...
廠商2 生產producta2 ...
廠商2 生產productb2 ...
其實,上例中本來可以不用到了兩個抽象工廠,只剩乙個也可,但是這樣子與我們現實生活中不同廠商各自生產自己的產品有點不同,所以就將其分開為兩個了,也就是將兩個廠商完全地分離開。
由上面類圖可以知道,一旦任何乙個廠商開發出了產品
c的話,那麼這個廠商肯定需要擴充套件自己的工廠來投入到
c產品的生產中,那麼此時工廠
1和工廠
2就需要進行一定的改變了,這很明顯不符合開閉原則。
何時使用工廠方法設計模式?
jdbc是該模式的乙個很好的例子;資料庫應用程式不需要知道它將使用哪種資料庫,所以它也不知道應該使用什麼具體的資料庫驅動類。相反,它使用工廠方法來獲取連線、語句和其它物件,這使得改變後台資料庫變得非常靈活同時並不會改變你的dao層。
本文出自 「螞蟻」 部落格,請務必保留此出處
抽象工廠模式 設計模式3之抽象工廠模式
工廠方法模式中工廠只負責同類產品的生產。比如電視機工廠不應該生產汽車。然而現實生活中有很多綜合型的工廠,比如有些電視工廠不僅生產電視機,還會生產與之配套的機頂盒。那麼抽象工廠模式隨之誕生,這種模式將考慮多種型別產品的生產。我們總結下 工廠方法模式只考慮成產同一等級級的產品抽象方法模式考慮生產多等級的...
設計模式之抽象工廠模式
目標 定義了乙個建立一系列相關或相互依賴的介面,而無需指定它們的具體類。用於交換產品系列,如 access sql server 產品的具體類名被具體工廠的實現分離 下面是示例 include include include using namespace std 使用者抽象介面 class ius...
設計模式之抽象工廠模式
定義 abstract factory,提供乙個建立一系列相關或相互依賴物件的介面,而無需制定它們具體的類 場景 有一家生產螺絲螺帽的工廠,螺絲有兩種型號 公的和母的,螺帽也有兩種型號 公的和母的。沒個車間只生產一種螺絲和螺帽。這裡車間就是乙個concretefactory 具體工廠 螺絲和螺帽便是...