本文繼續介紹23種設計模式系列之抽象工廠模式。
前面已經介紹過簡單工廠模式和工廠方法模式,這裡繼續介紹第三種工廠模式-抽象工廠模式,還是以汽車的製造為例。
例子背景:
隨著客戶的要求越來越高,寶馬車需要不同配置的空調和發動機等配件。於是這個工廠開始生產空調和發動機,用來組裝汽車。這時候工廠有兩個系列的產品:空調和發動機。寶馬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設計模式之抽象工廠模式
以肯德基麥當勞為例 解析抽象的工廠模式,以下是 的實現 第乙個介面 hb 建立漢堡的工廠 package com.factory.hb hb 漢堡 author lx public inte ce factoryhb 第乙個實現類 肯德基的漢堡 package com.imple.hb import...
Java設計模式之抽象工廠模式
上兩篇講解了簡單工廠模式和工廠方法模式,下面講解工廠模式的最後乙個抽象工廠模式 隨著客戶的要求越來越高,寶馬車需要不同配置的空調和發動機等配件。於是這個工廠開始生產空調和發動機,用來組裝汽車。這時候工廠有兩個系列的產品 空調和發動機。寶馬320li系列配置a型號空調和a型號發動機,寶馬520li系列...
Java設計模式之抽象工廠模式
一 什麼是抽象工廠模式 抽象工廠模式是所有形態的工廠模式中最為抽象和最具一般性的。抽象工廠模式可以向客戶端提供乙個藉口,使得客戶端在不必指定產品的具體型別的情況下,能夠建立多個產品族的產品物件。fruit介面 public inte ce fruit public abstract fruit ba...