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)品