《Android源碼設(shè)計模式解析與實戰(zhàn)》-工廠方法模式

UML類圖

模式定義

工廠方法模式(FACTORY METHOD)是一種常用的對象創(chuàng)建型設(shè)計模式,此模式的核心精神是封裝類中不變的部分,提取其中個性化善變的部分為獨(dú)立類,通過依賴注入以達(dá)到解耦、復(fù)用和方便后期維護(hù)拓展的目的。

角色劃分

組成(角色) 關(guān)系 作用
抽象產(chǎn)品(Product) 具體產(chǎn)品的父類 描述具體產(chǎn)品的公共接口
具體產(chǎn)品(ConcreteProduct) 抽象產(chǎn)品的子類,工廠類創(chuàng)建的目標(biāo)類 描述生產(chǎn)的具體產(chǎn)品
抽象工廠(Factory) 具體工廠的父類 描述具體工廠的公共接口
具體工廠(ConcreteFactory) 抽象工廠的子類;被外界調(diào)用 描述具體工廠; 實現(xiàn)FactoryMethod工廠方法創(chuàng)建產(chǎn)品的實例

簡單實例

一個工廠需要生產(chǎn)一堆的產(chǎn)品。但是這個產(chǎn)品種類繁多,具體生成什么產(chǎn)品并不知道。所以工廠就有一個抽象方法,生產(chǎn)產(chǎn)品推脫給子類來實現(xiàn)。

//產(chǎn)品
public abstract class Product {
}
//具體產(chǎn)品
public class ConcreteProductA extends Product{
}
public class ConcreteProductB extends Product{
}

//工廠
public abstract class Factory {
    public abstract Product createProduct();
}
//具體工廠
public class FactoryA extends Factory {

    @Override
    public Product createProduct() {
        return new ConcreteProductA();
    }
}
public class FactoryB extends Factory {

    @Override
    public Product createProduct() {
        return new ConcreteProductB();
    }
}

優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

  • 更符合開-閉原則
    新增一種產(chǎn)品時,只需要增加相應(yīng)的具體產(chǎn)品類和相應(yīng)的工廠子類即可
    簡單工廠模式需要修改工廠類的判斷邏輯

  • 符合單一職責(zé)原則
    每個具體工廠類只負(fù)責(zé)創(chuàng)建對應(yīng)的產(chǎn)品

  • 不使用靜態(tài)工廠方法,可以形成基于繼承的等級結(jié)構(gòu)。

總結(jié):工廠模式可以說是簡單工廠模式的進(jìn)一步抽象和拓展,在保留了簡單工廠的封裝優(yōu)點(diǎn)的同時,讓擴(kuò)展變得簡單,讓繼承變得可行,增加了多態(tài)性的體現(xiàn)。

缺點(diǎn):

  • 添加新產(chǎn)品時,除了增加新產(chǎn)品類外,還要提供與之對應(yīng)的具體工廠類,系統(tǒng)類的個數(shù)將成對增加,在一定程度上增加了系統(tǒng)的復(fù)雜度;同時,有更多的類需要編譯和運(yùn)行,會給系統(tǒng)帶來一些額外的開銷;

  • 由于考慮到系統(tǒng)的可擴(kuò)展性,需要引入抽象層,在客戶端代碼中均使用抽象層進(jìn)行定義,增加了系統(tǒng)的抽象性和理解難度,且在實現(xiàn)時可能需要用到DOM、反射等技術(shù),增加了系統(tǒng)的實現(xiàn)難度。

  • 雖然保證了工廠方法內(nèi)的對修改關(guān)閉,但對于使用工廠方法的類,如果要更換另外一種產(chǎn)品,仍然需要修改實例化的具體工廠類;

  • 一個具體工廠只能創(chuàng)建一種具體產(chǎn)品

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容