設計模式GOF23——抽象工廠模式

抽象工廠模式(Abstract Factory)是創建者模式的一種,是一種負責創建對象的模式。

模式的職責

抽象工廠算是工廠模式的一種,因爲邏輯和實現相對複雜一些,所以在設計模式中不少說明都是分開說明的。
抽象工廠也是爲了實現對象創建和對象使用的分離。工廠模式雖然已經實現了這一需求,但是還是不夠徹底。比如:如果創建的對象不是一個對象,而已一系列對象的時候,普通的工廠模式就會無能爲力了。這個時候就需要抽象工廠模式。
簡而言之,抽象工廠模式的職責是創建產品族和使用產品族的分離。是工廠模式的一種特殊情況。

模式的實現

創建一個工廠對象的抽象類,定義產品族的基本信息和方法,將產品族的創建封裝在實現類的相應方法中。對於對象的創建和管理,可以使用相應類的抽象接口來實現。
抽象工廠不可以增加產品,但可以增加產品族。

//引擎接口,汽車產品族的對象之一
public interface Engine {
    void start();
}
//豪華版引擎類
public class LuxuryEngine implements Engine{

    public void start() {
        //奢侈版引擎的方法實現
    }

}
//低端版引擎類
public class LowEngine implements Engine{

    public void start() {
        //低端版引擎的方法實現
    }

}
public interface Seat {
    void seat();
}
//豪華版車座類
public class LuxurySeat implements Seat{

    public void seat() {
        //奢侈版車座的方法實現
    }

}
//低端版車座類
public class LowSeat implements Seat{

    public void seat() {
        //低端版車座的方法實現
    }

}
//奢侈版汽車的創建類,實現奢侈版汽車的創建
public class LuxuryCar implements CarFactory{
//奢侈版汽車的引擎創建
    public Engine createEngine() {
        Engine e = new LuxuryEngine();
        return e;
    }
//奢侈版汽車的車座創建
    public Seat createSeat() {
        Seat s = new LuxurySeat();
        return s;
    }

}
//低端版汽車的創建類,實現低端版汽車的創建
public class LuxuryCar implements CarFactory{
//低端版汽車的引擎創建
    public Engine createEngine() {
        Engine e = new LowEngine();
        return e;
    }
//低端版汽車的車座創建
    public Seat createSeat() {
        Seat s = new LowSeat();
        return s;
    }

}

低端版和奢侈版算是兩種不同的產品組,通過對創建工廠的抽象,使得不同的產品組的編寫變得容易一些。
類似的一套產品的創建和更換可以用抽象工廠方式來做到,比如類似QQ空間換皮膚,可以通過抽象工廠模式變得容易些。

工廠模式的總結

簡單工廠模式適合創建對象但擴展的話不符合開閉原則。
工廠模式符合開閉原則,但是會創建過多的類。
抽象工廠模式是對產品族的創建和控制分離的特殊狀況的工廠模式。
工廠模式在實際應用中一般不會單獨出現,往往會和其他的方式結合起來。
工廠模式的一些應用場景:
1. JDK中Calendar的getInstance方法
2. JDBC中Connection對象的獲取。
3. Hibernate中SessionFactory創建Session。
4. Spring中IOC容器創建管理bean對象。
5. XML解析時DocumentBuliderFactory創建解析對象。
6. 反射中Class對象的newInstance
其實工廠模式的應用還是比較廣泛的,一般一些需要創建XXXFactory的都屬於工廠模式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章