例子背景:
隨著客戶的要求越來越高,寶馬車需要不同配置的空調和發動機等配件。於是這個工廠開始生產空調和發動機,用來組裝汽車。這時候工廠有兩個系列的產品:空調和發動機。寶馬320系列配置a型號空調和a型號發動機,寶馬230系列配置b型號空調和b型號發動機。
概念:
抽象工廠模式是工廠方法模式的公升級版本,他用來建立一組相關或者相互依賴的物件。比如寶馬320系列使用空調型號a和發動機型號a,而寶馬230系列使用空調型號b和發動機型號b,那麼使用抽象工廠模式,在為320系列生產相關配件時,就無需制定配件的型號,它會自動根據車型生產對應的配件型號a。
當每個抽象產品都有多於乙個的具體子類的時候(空調有型號a和b兩種,發動機也有型號a和b兩種),工廠角色怎麼知道例項化哪乙個子類呢?比如每個抽象產品角色都有兩個具體產品(產品空調有兩個具體產品空調a和空調b)。抽象工廠模式提供兩個具體工廠角色(寶馬320系列工廠和寶馬230系列工廠),分別對應於這兩個具體產品角色,每乙個具體工廠角色只負責某乙個產品角色的例項化。每乙個具體工廠類只負責建立抽象產品的某乙個具體子類的例項。
抽象工廠模式**
產品類:
//發動機以及型號
public inte***ce engine
public class enginea extends engine
} public class enginebextends engine
} //空調以及型號
public inte***ce aircondition
public class airconditiona extends aircondition
} public class airconditionb extends aircondition
}
建立工廠類:
//建立工廠的介面
public inte***ce abstractfactory
//為寶馬320系列生產配件
public class factorybmw320 implements abstractfactory
@override
public aircondition createaircondition()
} //寶馬523系列
public class factorybmw523 implements abstractfactory
@override
public aircondition createaircondition()
}
客戶:
public class customer
}
關於抽象工廠模式與工廠方法模式的區別,這裡就不說了,感覺多看幾遍例子就能理解,還有很多提到的產品族、等級結構等概念,說了反而更難理解。
抽象工廠模式的起源
下面引用一段
抽象工廠模式的起源:
抽象工廠模式的起源或者最早的應用,是用於建立分屬於不同作業系統的視窗構建。比如:命令按鍵(button)與文字框(text)都是視窗構建,在unix作業系統的視窗環境和windows作業系統的視窗環境中,這兩個構建有不同的本地實現,它們的細節有所不同。
在每乙個作業系統中,都有乙個視窗構建組成的構建家族。在這裡就是button和text組成的產品族。而每乙個視窗構件都構成自己的等級結構,由乙個抽象角色給出抽象的功能描述,而由具體子類給出不同作業系統下的具體實現。
可以發現在上面的產品類圖中,有兩個產品的等級結構,分別是button等級結構和text等級結構。同時有兩個產品族,也就是unix產品族和windows產品族。unix產品族由unix button和unix text產品構成;而windows產品族由windows button和windows text產品構成。
系統對產品物件的建立需求由乙個工程的等級結構滿足,其中有兩個具體工程角色,即unixfactory和windowsfactory。unixfactory物件負責建立unix產品族中的產品,而windowsfactory物件負責建立windows產品族中的產品。這就是抽象工廠模式的應用,抽象工廠模式的解決方案如下圖:
顯然,乙個系統只能夠在某乙個作業系統的視窗環境下執行,而不能同時在不同的作業系統上執行。所以,系統實際上只能消費屬於同乙個產品族的產品。
在現代的應用中,抽象工廠模式的使用範圍已經大大擴大了,不再要求系統只能消費某乙個產品族了。
總結:無論是簡單工廠模式,工廠方法模式,還是抽象工廠模式,他們都屬於工廠模式,在形式和特點上也是極為相似的,他們的最終目的都是為了解耦。在使用時,我們不必去在意這個模式到底工廠方法模式還是抽象工廠模式,因為他們之間的演變常常是令人琢磨不透的。經常你會發現,明明使用的工廠方法模式,當新需求來臨,稍加修改,加入了乙個新方法後,由於類中的產品構成了不同等級結構中的產品族,它就變成抽象工廠模式了;而對於抽象工廠模式,當減少乙個方法使的提供的產品不再構成產品族之後,它就演變成了工廠方法模式。
所以,在使用工廠模式時,只需要關心降低耦合度的目的是否達到了。
java設計模式(二) 抽象工廠模式
1.抽象產品介面 定義產品的介面,公共的暴露方法。便於實際的產品類實現。2.具體的產品類 包含實際產品的類的邏輯處理 3.抽象工廠介面 定義產生系列物件的介面 4.具體的工廠實現 實現抽象的介面工廠,返回具體的產品類的實現。下面是具體的 示例 package factory.抽象產品角色 交通工具介...
java設計模式 抽象工廠模式
1.概念 設計模式 一書中對於抽象工廠模式是這樣定義的 提供乙個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類。產品 plant介面 public inte ce plant 標誌介面 具體產品planta,plantb public class planta implements pl...
JAVA設計模式 抽象工廠模式
目錄 一 什麼是抽象工廠模式 二 模式中包含的角色及其職責 三 抽象工廠模式的優缺點 抽象工廠模式是所有形態的工廠模式中最為抽象和最具一般性的。抽象工廠模式可以向客戶端提供乙個介面,使得客戶端在不必指定產品的具體型別的情況下,能夠建立多個產品族的產品物件。抽象工廠 factory 角色 抽象工廠模式...