定義:爲創建一(yī)組相關或相互依賴的對象提供一(yī)個接口,而且無需指定他們的具體(tǐ)類。
類型:創建類模式
類圖:
抽象工(gōng)廠模式與工(gōng)廠方法模式的區别
抽象工(gōng)廠模式是工(gōng)廠方法模式的升級版本,他用來創建一(yī)組相關或者相互依賴的對象。他與工(gōng)廠方法模式的區别就在于,工(gōng)廠方法模式針對的是一(yī)個産品等級結構;而抽象工(gōng)廠模式則是針對的多個産品等級結構。在編程中(zhōng),通常一(yī)個産品結構,表現爲一(yī)個接口或者抽象類,也就是說,工(gōng)廠方法模式提供的所有産品都是衍生(shēng)自同一(yī)個接口或抽象類,而抽象工(gōng)廠模式所提供的産品則是衍生(shēng)自不同的接口或抽象類。
在抽象工(gōng)廠模式中(zhōng),有一(yī)個産品族的概念:所謂的産品族,是指位于不同産品等級結構中(zhōng)功能相關聯的産品組成的家族。抽象工(gōng)廠模式所提供的一(yī)系列産品就組成一(yī)個産品族;而工(gōng)廠方法提供的一(yī)系列産品稱爲一(yī)個等級結構。我(wǒ)們依然拿生(shēng)産汽車(chē)的例子來說明他們之間的區别。
在上面的類圖中(zhōng),兩廂車(chē)和三廂車(chē)稱爲兩個不同的等級結構;而2.0排量車(chē)和2.4排量車(chē)則稱爲兩個不同的産品族。再具體(tǐ)一(yī)點,2.0排量兩廂車(chē)和2.4排量兩廂車(chē)屬于同一(yī)個等級結構,2.0排量三廂車(chē)和2.4排量三廂車(chē)屬于另一(yī)個等級結構;而2.0排量兩廂車(chē)和2.0排量三廂車(chē)屬于同一(yī)個産品族,2.4排量兩廂車(chē)和2.4排量三廂車(chē)屬于另一(yī)個産品族。
明白(bái)了等級結構和産品族的概念,就理解工(gōng)廠方法模式和抽象工(gōng)廠模式的區别了,如果工(gōng)廠的産品全部屬于同一(yī)個等級結構,則屬于工(gōng)廠方法模式;如果工(gōng)廠的産品來自多個等級結構,則屬于抽象工(gōng)廠模式。在本例中(zhōng),如果一(yī)個工(gōng)廠模式提供2.0排量兩廂車(chē)和2.4排量兩廂車(chē),那麽他屬于工(gōng)廠方法模式;如果一(yī)個工(gōng)廠模式是提供2.4排量兩廂車(chē)和2.4排量三廂車(chē)兩個産品,那麽這個工(gōng)廠模式就是抽象工(gōng)廠模式,因爲他提供的産品是分(fēn)屬兩個不同的等級結構。當然,如果一(yī)個工(gōng)廠提供全部四種車(chē)型的産品,因爲産品分(fēn)屬兩個等級結構,他當然也屬于抽象工(gōng)廠模式了。
抽象工(gōng)廠模式代碼
interface IProduct1 { public void show(); } interface IProduct2 { public void show(); } class Product1 implements IProduct1 { public void show() { System.out.println("這是1型産品"); } } class Product2 implements IProduct2 { public void show() { System.out.println("這是2型産品"); } } interface IFactory { public IProduct1 createProduct1(); public IProduct2 createProduct2(); } class Factory implements IFactory{ public IProduct1 createProduct1() { return new Product1(); } public IProduct2 createProduct2() { return new Product2(); } } public class Client { public static void main(String[] args){ IFactory factory = new Factory(); factory.createProduct1().show(); factory.createProduct2().show(); } }
抽象工(gōng)廠模式的優點
抽象工(gōng)廠模式除了具有工(gōng)廠方法模式的優點外(wài),最主要的優點就是可以在類的内部對産品族進行約束。所謂的産品族,一(yī)般或多或少的都存在一(yī)定的關聯,抽象工(gōng)廠模式就可以在類内部對産品族的關聯關系進行定義和描述,而不必專門引入一(yī)個新的類來進行管理。
抽象工(gōng)廠模式的缺點
産品族的擴展将是一(yī)件十分(fēn)費(fèi)力的事情,假如産品族中(zhōng)需要增加一(yī)個新的産品,則幾乎所有的工(gōng)廠類都需要進行修改。所以使用抽象工(gōng)廠模式時,對産品等級結構的劃分(fēn)是非常重要的。
适用場景
當需要創建的對象是一(yī)系列相互關聯或相互依賴的産品族時,便可以使用抽象工(gōng)廠模式。說的更明白(bái)一(yī)點,就是一(yī)個繼承體(tǐ)系中(zhōng),如果存在着多個等級結構(即存在着多個抽象類),并且分(fēn)屬各個等級結構中(zhōng)的實現類之間存在着一(yī)定的關聯或者約束,就可以使用抽象工(gōng)廠模式。假如各個等級結構中(zhōng)的實現類之間不存在關聯或約束,則使用多個獨立的工(gōng)廠來對産品進行創建,則更合适一(yī)點。
總結
無論是簡單工(gōng)廠模式,工(gōng)廠方法模式,還是抽象工(gōng)廠模式,他們都屬于工(gōng)廠模式,在形式和特點上也是極爲相似的,他們的最終目的都是爲了解耦。在使用時,我(wǒ)們不必去(qù)在意這個模式到底工(gōng)廠方法模式還是抽象工(gōng)廠模式,因爲他們之間的演變常常是令人琢磨不透的。經常你會發現,明明使用的工(gōng)廠方法模式,當新需求來臨,稍加修改,加入了一(yī)個新方法後,由于類中(zhōng)的産品構成了不同等級結構中(zhōng)的産品族,它就變成抽象工(gōng)廠模式了;而對于抽象工(gōng)廠模式,當減少一(yī)個方法使的提供的産品不再構成産品族之後,它就演變成了工(gōng)廠方法模式。
所以,在使用工(gōng)廠模式時,隻需要關心降低耦合度的目的是否達到了。