首先回顧下簡單工廠模式的主要內容:簡單工廠模式就是實質就是專門定義了乙個工廠類,利用工廠類的靜態方法來根據使用者需求建立物件,優點是客戶端的壓力較小,客戶端不需要做建立例項的操作,只需要呼叫工廠類中的方法就可以獲得對應例項,而其缺點也非常明顯,其所有建立工作都在乙個工廠類完成,耦合性較高,而且當系統需要增加或者修改產品時需要改動工廠類,既不符合單一職責的原則也不符合開放-關閉原則,所以就出現了工廠模式。
工廠模式
工廠模式是對簡單工廠模式的進一步抽象化,是簡答工廠模式的衍生,根據設計模式的基本原則也是設計模式的精髓「封裝變化點」,即**發生改變就把**封裝起來,所以工廠模式對簡單工廠中的工廠類做了乙個封裝,使其滿足單一職責和開放-關閉原則。
【解決問題】:簡單工廠模式中違背了單一職責和開放-關閉原則。
【核心思想】:建立乙個抽象工廠的基類,給每個產品建立乙個工廠,該工廠繼承之抽象工廠,規定每個產品都有特定的工廠來建立。
【角色】
抽象工廠角色:這是工廠模式的核心,它與應用程式無關,是具體工廠必須繼承的父類或者必須實現的介面
具體工廠角色:包含邏輯業務的**,由應用程式呼叫以建立對應的具體產品物件
抽象產品角色:具體產品必須繼承的父類或者必須實現的介面
具體產品角色:所建立的物件就是此角色的例項
下面仍舊以簡單工廠中的例項來講解,對其進行改造
【角色分析】
抽象工廠:衣服製造廠 包含衣服的一些公共特性
具體工廠:**型別衣服製造廠 每個衣服製造廠只負責一件衣服(高內聚) ,當然也就是說當沒有客戶需要的衣服的時候需要建立乙個對應的工廠及一件衣服 由該工廠負責提供這件衣服 但是對於以前的工廠和衣服都沒有影響(這是設計模式所期望的--單一職責原則)
抽象產品:衣服 包含衣服的一些公共特性
具體產品:**型別衣服 繼承抽象產品,當然可擴充套件自身特性
******************************==**片段講解******************************
角色分析好了,就可以進行改造了,貼上改造完畢的各個部分**:
抽象工廠類: 1
//抽象工廠:宣告工廠方法 返回乙個產品
2public
abstract
class
clothfactory3
該類中定義了乙個抽象的createcloth()方法,用於建立衣服例項。
具體工廠類:
具體工廠 1 //具體工廠1:商務裝工廠 只負責生產商務裝
public class businessfactory : clothfactory
}//具體工廠2:運動裝工廠 只負責生產運動裝
public class sportfactory : clothfactory
}//具體工廠3:校服工廠 只負責生產校服
public class lifefactory : clothfactory
該類為核心,類中定義了
businessfactory
,sportfactory,
lifefactory
三個工廠分別來建立
商務裝,
運動裝,
校服,三個工廠都繼承之抽象工廠
clothfactory
,並都重寫了抽象工廠中的
createcloth()
方法,分別用來建立該工廠生產的衣服,利用黎克特制替換原則(子類代替父類)來實現,這是產品需要改變(新增,修改,刪除)時,如新增,只需要新增乙個專門生產該產品的工廠和該產品就可以了,新增操作對之前所有的工廠和產品沒有直接的影響。修改同理,只需要修改建立該產品的工廠類就可以了,很好的遵循了開放-關閉原則,同時乙個工廠類建立乙個產品,遵循了單一職責的原則。
抽象產品類: 1
//定義抽象產品:衣服
2public
abstract
class
cloth
3該方法不需要作改變,仍舊定義了乙個
getcloth()
方法,模擬使用產品。
具體產品類:
具體產品 1 //定義具體產:1:商務裝
class businesscloth : cloth
}//定義具體產品2:運動裝
class sportcloth : cloth
}//定義具體產品3:休閒服
class lifecloth : cloth
}該類也不需要作任何改變,根據**封裝改變**,工廠類的封裝和產品沒有直接的影響,仍舊定義了三種型別的衣服,並重寫抽象產品中的抽象方法,因為每種產品都有自身特性,有自身獨特的功能。
客戶端:
客戶端 1 //客戶端
class program
}工廠模式小結:
優點:解決了簡單工廠中違背單一職責和開放-關閉原則問題,同時增加了程式的可擴充套件性,遮蔽了產品類。
缺點:1.邏輯判斷放在了客戶端進行
2.每新增乙個產品都需要為它專門新增乙個工廠用來生產,繁雜
3.每個工廠都只能生產一種產品,品種單一。
設計模式之二 簡單工廠模式
前言 簡單工廠模式根據提供的資料或者引數返回幾個可能的類中的乙個例項,說通俗點有點像物件導向程式設計中的多型性,乙個基類,有多個派生類,在另外的呼叫程式中,根據引數來決定返回這個基類的哪個具體的派生類,返回值為基類型別,因為基類的引用可以指向派生類物件,而且這些所有的派生類都包含有基類的函式,也就是...
設計模式之工廠模式(簡單工廠 工廠模式 抽象工廠)
參考博文 侵權必刪 什麼是工廠模式 通過 物件建立 模式繞開new,來避免物件建立 new 過程中所導致的緊耦合 依賴具體類 適用性 使用new建立物件且導致緊耦合的場景。思考 物件導向程式設計要以動態的思維去看待 換句話說,在看 時需要時間概念,發現 在未來的穩定之處和變化之處。一般介面和抽象類是...
設計模式之二 簡單工廠
最近這幾天把之前學到的設計模式寫個總結,現在先寫個簡單工廠模式 先看下uml圖吧 從uml圖中我們可以看出,phonefactory呼叫getphone方法去產生對應的phone物件 然我們看看 吧 package edu.fjnu.cs.hwb.esayfactory 定義個phone介面 pub...