理解:
當我們有一個類,他有多個派生類;該類中有一個對象,有多種實現方式。在該類中,我們需要使用該對象的方法,但實例化該對象是由不同的派生類確定的(象棋棋盤中是象棋對象,五子棋棋盤中是五子棋對象),因此,我們在父類中不能夠進行初始化,只能夠將其初始化延遲到子類當中。
實現方式是通過一個protected的createXXX()函數,讓子類重寫,以獲得相應的實例化對象。
價值:
使得我們能夠在不知道對象的具體形式的情況下,能夠進行調用,可以在父類中封裝一些流程。
否則,我們可能需要在父類中進行if-else 或者switch ,來進行對象的實例化。這樣的話,父類必須要知道子類的信息,才能進行,使得耦合變大。
與抽象工廠對比:
抽象工廠,主要用於將對象從new的創建方式中脫離出來,使得對象的創建與使用分離開來,這樣,對象要使用其他具體類進行實例化時,不會影響到使用對象的代碼。
工廠模式,主要用於讓類中的對象的實例化延遲到子類當中,以實現對象方法調用時的多肽效果。
因此,抽象工廠主要是提供外界使用的,讓外接調用其創建對象的方法並隱藏其實現;而工廠方法主要是內部的實現方式,使用protected函數讓子類重寫創建對象的方法。用戶可以知道是否使用了抽象工廠模式,而不會輕易知道是否使用了工廠模式。
因此,抽象工廠其名曰抽象,抽象往往是提供外界一個抽象類或者接口來定義其能夠調用的方法,也意味着外界可以更清楚其方式了。
與模板方法對比:
模板方法中,也是在實現延遲到子類,使用protected的函數。但模板方法中,在父類中定義了函數調用方式、順序,讓子類來對其中的一些函數進行實現。
而工廠模式中,僅是將對象的創建延遲到子類中,同時他並沒有相應的“模板”,因此,還是有一定的差別的。