使用頻率最高。
概述:首先將需要建立的不同物件的**封裝到不同的類中,這些類成為具體產品類,而將它們的公共**進行抽象和提取後封裝在乙個抽象產品類中,每乙個具體產品類都是抽象產品類的子類;然後提供乙個工廠類用於建立各種產品,在工廠類中提供乙個建立產品的工廠方法,該方法可以根據所傳入的引數不同建立不同的具體產品物件;客戶端只需呼叫工廠類的工廠方法並傳入相應的引數即可得到乙個產品物件。
簡單工廠模式中建立例項的工廠方法是靜態方法,所以又稱為靜態工廠方法。
簡單工廠模式結構圖包含3個角色:
(1)factory 工廠角色:工廠類,簡單工廠模式的核心,負責實現建立所有產品例項的內部邏輯;可以被外部直接呼叫;提供靜態的工廠方法,即可以通過工廠類的類名直接呼叫,返回型別為抽象產品型別product
(2)product 抽象產品角色:工廠類所建立的所有物件的父類,封裝了各類產品物件的公有方法,使得在工廠類只需定義乙個通用的工廠方法,所建立的產品物件都是其子類物件;
(3)concreteproduct具體產品角色:簡單工廠模式的建立目標,所有被建立的物件都充當這個角色的某個具體類的例項。每乙個具體產品角色都繼承了抽象產品角色,需要實現抽象產品類中的抽象方法。
抽象產品類提供公共業務方法,以及抽象業務方法,在具體產品類裡面要實現抽象類宣告的業務方法。工廠類的核心是工廠方法,內部承擔了複雜的邏輯,根據客戶端呼叫時所傳入的引數的不同可以建立不同的產品物件(比如實際呼叫不同的建立函式)。在客戶端,不是用new而是只通過工廠類的工廠方法就可以得到產品物件。
有時候為了簡化簡單工廠模式,會把具體產品類合抽象產品類合併,靜態工廠方法轉移至抽象產品類。
總結:1. 優點:
(1)工廠類包含必要的判斷邏輯:何時建立哪乙個產品類的例項?客戶端免除了直接建立產品物件的職責,僅僅「消費」產品物件。實現了物件建立和使用的分離。
(2)客戶端無需知道所建立的具體產品類的類名,只需要具體產品類對應的引數。
(3)通過引入配置檔案,可以在不修改任何客戶端**的情況下,更換和增加新的具體產品類,增加靈活性。
2. 缺點:
(1)工廠類職責過重,一旦不能正常工作,整個系統受影響。(故障點)
(2)使用簡單工廠模式勢必會增加系統中類的個數(引入新的工廠類),增加複雜度
(3)系統擴充套件困難,一旦新增新產品就不得不修改工廠方法邏輯,在產品型別較多時造成工廠邏輯過於複雜,不利於維護和擴充套件。
(4)使用了靜態工廠方法,造成工廠角色無法形成基於繼承的等級結構。
3. 適用場景
(1)工廠類負責建立的物件比較少,由於建立的物件較少,不會造成工廠方法的邏輯過於複雜。
(2)客戶端知道傳入工廠類的引數,對於如何建立物件並不關心。
設計模式 工廠模式(五)
軟體領域中的設計模式的重要性不言而喻。設計模式中運用了物件導向程式設計語言的重要特性 封裝 繼承 多型。雖然知道這些特性的定義但是並沒有做到真正的理解,這樣特性有什麼作用?用於什麼場合中等等問題,帶著疑問開始學習設計模式,主要參考 大話設計模式 和 設計模式 可復用物件導向軟體的基礎 兩本書。工廠方...
設計模式 五 工廠模式
工廠模式 定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類。工廠方法使乙個類的例項化延遲到其子類,克服了簡單工廠違背開放 封閉原則的缺點,又保持了封裝物件建立過程的有點。開放 封閉原則 對於拓展是開放的,對於更改是封閉的 學生和志願者繼承雷鋒類,學生工廠和志願者工廠實現了雷鋒工廠介面,當需要改變...
設計模式 工廠模式(簡單工廠)
一 簡單工廠 定義 簡單工廠模式 factory pattern 屬於類的創新型模式,又叫靜態工廠方法模式 static factorymethod pattern 是通過專門定義乙個類來負責建立其他類的例項,被建立的例項通常都具有共同的父類。特點 工廠類直接實現,乙個產品介面,乙個工廠類可以產生多...