首頁  >  文章  >  Java  >  什麼是抽象工廠模式

什麼是抽象工廠模式

PHP中文网
PHP中文网原創
2017-06-22 14:06:011833瀏覽

這篇說說工廠的最後一種,還是先上 

抽象工廠模式定義#(來自百度百科):
        抽象工廠模式是所有形態的工廠模式中最為抽象、最具一般性的一種形態。抽象工廠模式是指當有多個抽象角色時,使用的工廠模式。
抽象工廠模式可以向客戶端提供一個接口,使客戶端在不必指定產品的具體的情況下,創建多個產品族中的產品對象。根據里氏替換原則,
任何接受父類型的地方,都應能夠接受子類型。因此,實際上系統所需要的,只是類型與這些抽象產品角色相同的一些實例,而不是這些抽象產品的實例。
換言之,也就是這些抽象產品的具體子類別的實例。工廠類別負責創建抽象產品的具體子類別的實例。

UML 類別圖

#特定程式碼

public class Client {public static void main(String[] args) {//        Creator benzCreator = new BenzCreator();//        benzCreator.createCar().run();////        Creator bmwCreator = new BmwCreator();//        bmwCreator.createCar().run();AbstractFactory factory1 = new Factory1();
        factory1.createProductA().getProductAName();
        factory1.createProductB().getProductBName();

        AbstractFactory factory2 = new Factory2();
        factory2.createProductA().getProductAName();
        factory2.createProductB().getProductBName();
    }
}public interface AbstractFactory {
    AbstractProductA createProductA();

    AbstractProductB createProductB();
}public class Factory1 implements AbstractFactory {
    @Overridepublic AbstractProductA createProductA() {return new ProductA1();
    }

    @Overridepublic AbstractProductB createProductB() {return new ProductB1();
    }
}public class Factory2 implements AbstractFactory {

    @Overridepublic AbstractProductA createProductA() {return new ProductA2();
    }

    @Overridepublic AbstractProductB createProductB() {return new ProductB2();
    }
}public interface AbstractProductA {
       String getProductAName();
}public class ProductA1 implements AbstractProductA {
    ProductA1(){
        System.out.println("产品A1");
    }

    @Overridepublic String getProductAName() {return "产品A1名称";
    }
}public class ProductA2 implements AbstractProductA {
    ProductA2(){
        System.out.println("产品A2");
    }

    @Overridepublic String getProductAName() {return "产品A2名称";
    }
}public interface AbstractProductB {
    String getProductBName();
}public class ProductB1 implements AbstractProductB {
    ProductB1(){
        System.out.println("产品B1");
    }

    @Overridepublic String getProductBName() {return "产品B1名称";
    }
}public class ProductB2 implements AbstractProductB {
    ProductB2(){
        System.out.println("产品B2");
    }

    @Overridepublic String getProductBName() {return "产品B2名称";
    }
}

產品族:

     是指位於不同產品等級結構中,功能相關聯的產品組成的家族

具體例

     我舉個可能不恰當的例子
     例如我們電腦都是32和64位元的 對應的機器安裝對應位數的軟體
兩張光碟分別儲存32位元和64位元的軟體那裝機的時候只要拿一張光碟就搞定的整機軟體安裝不用挨個軟體去找。
這裡光碟就是具體的工廠如果每張光碟都有QQ和360(就是要打架怎樣?)
這裡32位元的光碟就是上面程式碼裡的Factory1 這裡64位元的光碟就是上面程式碼裡的Factory2
32位元的光碟裡的QQ就是ProductA1,360就是ProductB1
64位元的光碟裡的QQ就是ProductA2,360就是ProductB2

對於我這小白用戶,拿對光碟就行了,不需要既找對QQ的位數又找到360的位數,是不是很爽。

優缺點
優點:
      分離介面和實現,讓客戶端不需要知道特定的實作。
      產品族的切換變得容易,就像如果出現128位元的機器,無非多加一張光碟。

缺點:
     不容易擴充新產品(想像增加產品要增加多少類別和方法)。
    類別的層級結構複雜(看看類別圖都是想吐的有木有)

本質

       之前說過工廠方法的本質是選擇實現,就是選擇具體的產品
那抽象工廠就是選擇產品族,由單一產品變成產品族而已。

 

三種工廠模式說完了,他們之間的連結差異和演化過程就先挖個坑,之後再寫。

 

以上是什麼是抽象工廠模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn