一:初始工廠方法模式
包括:定義,,結構,參考實現
二:體會工廠方法模式
包括:場景問題,不用模式解決方案,使用模式解決方案
三:理解工廠方法模式
包括:認識工廠方法模式,工廠方法模式與ioc、di,平行的類層次結構,引數化工廠方法,工廠方法模式的優缺點
三:思考工廠方法模式
包括:工廠方法模式的本質,對設計原則的體現,何時選用
1,定義
乙個用於建立物件的介面(方法,不實現),讓子類絕對例項化那乙個類,factorymethod使乙個類例項化延遲到其子類
2,匯出資料的框架
實現乙個匯出資料的應用框架,來讓客戶選擇匯出方式,並真正實現資料匯出
通常這種系統,在匯出資料,會有一種約定模式,比如匯出成:文字,資料庫,excel,加密
不用模式的解決方案 productmethod包下example2
問題:對於實現匯出資料業務功能的物件,他需要exportfileapi的具體例項物件,但是它只知道exportfileapi介面,而不知道具體實現,該怎麼辦?
//只是想使用介面,而不是用來建立,責任不明確 //然後真正匯出,結構的擴充套件不是很方便,職責沒有分離, if (type == 1) else if (type == 2) else if(type==3)
使用模式
**詳見 productmethod包下example3
1,功能
讓父類在不知道具體實現情況下,完成自身的功能的呼叫,從具體的實現延遲到子類的實現
2,什麼時候使用抽象類?既要約束子類的行為,又要為子類提供公共的功能
3,實現成抽像類
工廠方法的實現中,通常父類會是乙個抽象類,裡面包含建立所需物件的抽象方法,這些抽象方法就是工廠方法
子類只是選擇具體的實現,沒有實現業務功能
4,實現成具體類
提供乙個預設的實現,用的相對比較多的 ,沒有擴充套件任何的子類,如果有子類,會覆蓋父類的方法
5,工廠方法的引數和返回值
工廠方法的實現中,可能需要引數,一邊決定到底選用哪一種具體的實現,工廠方法返回的是被建立物件的介面物件,當然也可以是抽象類或乙個具體類的實現
6,誰來使用工廠方法建立的物件
a,通常,應該是creator中其他的方法使用被建立的物件
b,客戶端應該使用creator物件或使用由creator建立出的物件,
總結:客戶端不直接使用工廠方法
7,工廠方法模式ioc,di
a,概念
依賴注入:應用程式依賴容器建立並注入它所需要的外部資源。di
控制反**容器控制應用程式,由容器反向的向應用程式注入應用程式所需要的外部資源
b,理解
c,過程
思想:松耦合,有利於功能復用。
最大的改變不是**,而是思想上,發生主從換位變化,應用程式變成被動的被動等待ioc/di容器建立並注入所需要的資源
8,工廠方法模式與ioc/di的關係
思想相似,都是主動變被動,獲得更靈活的程式結構
1,平行的類層次結構
假如有兩個類層次結構,其中乙個類層次中的每個類在另乙個類層次中都有乙個對應的類的結構,就被稱為平行的類層次結構
如果類層次結構的行為和屬性職責過多,把其中某一部分分離出來,形成兩個平行的類層次結構
2,把乙個類層次某些行為分離出來,讓類層次中的類把原本屬於自己的職責,委託給分離出來的類,從而使類層次變得更簡單
3,引數化工廠方法
簡單工廠是工廠方法的乙個特例;
通過給工廠方法傳遞引數,讓工廠根據引數的不同
4,優缺點
a,可以在不知具體實現的情況下程式設計(比較高層的實現或抽象)
b,更容易擴充套件物件的新版本
c,連線平行的類層次
d,具體產品物件和工廠方法的耦合性(工廠方法需要建立物件的)
5,簡單工廠(選擇實現,延遲到子類並沒有,相當於壓縮了)就是把工廠方法裡中建立物件的功能放到工廠中
工廠方法模式 工廠方法模式
工廠方法模式是簡單工廠模式的公升級版,簡單工廠模式不符合設計模式的原則 即 單一職責,開閉原則 優點 職責明確,擴充套件方便 缺點 需要建立多個工廠 實現步驟 1.將工廠通用方法抽取介面 例如 ifactory 2.將產品抽取介面 例如 icar 3.實現各種產品 例如 baomacar,benti...
工廠方法模式 工廠方法模式 二
工廠方法模式是對簡單工廠的進一步抽象和封裝,需要新的類物件時不需要對既有工廠類進行修改,而是增加新的工廠類。工程類可以使用模版進一步封裝,由編譯器來生成 從而減少 編寫工作量。工廠方法的 c 實現01part產品抽象基類class animal virtual void show 0 02part產...
工廠方法模式(一) 簡單工廠方法模式
ps 第二篇學習部落格,堅持就是勝利。繼續設計模式的學習,記錄工廠模式,加深自己的理解。基本結構 abstractproduct 用來定義基本的商品的抽象 public abstract class abstractphoneproduct 用來實現抽象商品,生成各種商品 public class ...