對於簡單工廠模式來說,我們可以看到在工廠類中,有大量的if判斷。當我們要引入新的圖形的時候,由於靜態工廠方法通過所傳入引數的不同來建立不同的圖形,那麼就需要修改工廠類的源**了,這個將違反六大原則中的「開閉原則」,我們需要做的是在增加新圖形的時候不修改已有的**。這裡就需要進一步分離。
在後面的設計中,我們不再提供乙個統一的工廠類來建立所有的產品物件,而是針對不同的圖形提供不同的工廠,系統提供乙個與產品登記結構對應的工廠等級結構。
工廠模式的定義如下:定義乙個用於建立物件的介面,讓子類決定將哪乙個類例項化。工廠方法模式讓乙個類的例項化延遲到其子類。
工廠模式下有如下幾個角色:
shape(抽象產品):它是定義產品的介面,是工廠方法模式所建立物件的超型別,也就是產品隊形的公共父類。
concreteshape(具體產品):它實現了抽象產品介面,某種型別的具體體產品由專門的具體工廠建立,具體工廠和具體產品之間一一對應。
factory(抽象工廠):在抽象工廠類中,宣告了工廠方法,用於返回乙個產品。抽象工廠是工廠方法模式的核心,所有建立物件的工廠類都必須實現該介面。
concretefactory(具體工廠):它是抽象工廠類的子類,實現了抽象工廠中定義的工廠方法,並由客戶端呼叫,返回乙個具體產品類的例項。
具體**例項如下:
inte***ce shape
class square implements shape
}class ******** implements shape
}class circular implements shape
}inte***ce shapefactory
class circularshapefactory
}class squareshapefactory
}class ********shapefactory
}public class client
}
工廠模式的優缺點:
工廠方法模式的主要優點如下:
(1) 在工廠方法模式中,工廠方法用來建立客戶所需要的產品,同時還向客戶隱藏了哪種具體產品類將被例項化這一細節,使用者只需要關心所需產品對應的工廠,無須關心建立細節,甚至無須知道具體產品類的類名。
(2) 基於工廠角色和產品角色的多型性設計是工廠方法模式的關鍵。它能夠讓工廠可以自主確定建立何種產品物件,而如何建立這個物件的細節則完全封裝在具體工廠內部。工廠方法模式之所以又被稱為多型工廠模式,就正是因為所有的具體工廠類都具有同一抽象父類。
(3) 使用工廠方法模式的另乙個優點是在系統中加入新產品時,無須修改抽象工廠和抽象產品提供的介面,無須修改客戶端,也無須修改其他的具體工廠和具體產品,而只要新增乙個具體工廠和具體產品就可以了,這樣,系統的可擴充套件性也就變得非常好,完全符合「開閉原則」。
工廠方法模式的主要缺點如下:
(1) 在新增新產品時,需要編寫新的具體產品類,而且還要提供與之對應的具體工廠類,系統中類的個數將成對增加,在一定程度上增加了系統的複雜度,有更多的類需要編譯和執行,會給系統帶來一些額外的開銷。
(2) 由於考慮到系統的可擴充套件性,需要引入抽象層,在客戶端**中均使用抽象層進行定義,增加了系統的抽象性和理解難度,且在實現時可能需要用到dom、反射等技術,增加了系統的實現難度。
參考部落格
設計模式 設計模式之工廠模式
工廠方法模式 建立模式 使用場景?作用?形態?場景 大量類似的實體類 要建立的實體類都是同一本質的東西 披薩 有部分類似功能 準備 烘烤 切法 實現方式不一樣 準備的材料不同 烘烤時間不同 切法不同 將繁瑣複雜的建立類的過程聚集在一起,有序清晰 把具體例項化的過程從客戶 中抽離 作用 1 將建立物件...
c 設計模式 之 工廠模式之 工廠模式
1 uml類圖 實現和依賴關係 實現 sportfactory jeepfactory hatchbackfactory 實現 ifactory 介面 sportcar jeepcar hatchbackcar 實現 icar 介面 依賴 ifactory 依賴 icar sportfactory ...
設計模式 工廠模式之簡單工廠模式
定義 由乙個工廠物件 工廠類 來指定建立某乙個產品類的例項。使用場景 客戶端只需傳入指定的引數即可,工廠類負責建立的物件較少 因為指定了傳入的引數 介面類 本想用iphone命名的,見諒 public inte ce phone實現介面類 public class huaweiphone imple...