Java設計模式:抽象工(gōng)廠模式

作者:網絡 | 發布時間:2020年10月30日 | 閱讀:845

定義:爲創建一(yī)組相關或相互依賴的對象提供一(yī)個接口,而且無需指定他們的具體(tǐ)類。

類型:創建類模式

類圖:

abstract-factory-pattern

抽象工(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ē)的例子來說明他們之間的區别。

abstract-factory-pattern

在上面的類圖中(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)廠模式時,隻需要關心降低耦合度的目的是否達到了。


相關内容