標籤:
參考網址:http://doc.okbase.net/luozhonglan/archive/103843.html
1. 簡單原廠模式
如何理解簡單工廠,Factory 方法, 抽象工廠三種設計模式?
簡單工廠的生活情境,賣早點的小攤販,他給你提供包子,饅頭,地溝油烙的煎餅等,小販是一個工廠,它生產包子,饅頭,地溝油烙的煎餅。該情境對應的UML圖如下所示:
圖1:簡單原廠模式UML圖
簡單原廠模式的參與者:
工廠(Factory)角色:接受用戶端的請求,通過請求負責建立相應的產品對象。
抽象產品(Abstract Product)角色: 是原廠模式所建立對象的父類或是共同擁有的介面。可是抽象類別或介面。
具體產品(ConcreteProduct)對象:原廠模式所建立的對象都是這個角色的執行個體。
簡單原廠模式的演變:
1.)當系統中只有唯一的產品時,可以省略抽象產品,1所示。這樣,工廠角色與具體產品可以合并。
簡單原廠模式的優缺點:
1.)工廠類含有必要的建立何種產品的邏輯,這樣用戶端只需要請求需要的產品,而不需要理會產品的實現細節。
2.)工廠類只有一個,它集中了所有產品建立的邏輯,它將是整個系統的瓶頸,同時造成系統難以拓展。
3.)簡單原廠模式通常使用靜態Factory 方法,這使得工廠類無法由子類繼承,這使得工廠角色無法形成基於繼承的等級結構。
2. Factory 方法模式
Factory 方法使用OOP的多態性,將工廠和產品都抽象出一個基類,在基類中定義統一的介面,然後在具體的工廠中建立具體的產品。Factory 方法的生活情境,聯合利華要生產“夏士蓮”和“清揚”兩款洗髮水,它會建一個生產“夏士蓮”的工廠和一個生產“清揚”的工廠。
圖2:Factory 方法的UML圖
Factory 方法模式中的參與者:
抽象工廠角色:與應用程式無關,任何在模式中建立對象的工廠必須實現這個介面。
具體工廠角色:實現了抽象工廠介面的具體類,含有與引用密切相關的邏輯,並且受到應用程式的調用以建立產品對象。
抽象產品角色:Factory 方法所建立產品對象的超類型,也就是產品對象的共同父類或共同擁有的介面。
具體產品角色:這個角色實現了抽象產品角色所聲名的介面。Factory 方法所建立的每個具體產品對象都是某個具體產品角色的執行個體。
Factory 方法的優缺點:
1.)降低了工廠類的內聚,滿足了類之間的層次關係,又很好的符合了物件導向設計中的單一職責原則,這樣有利於程式的拓展,三所示:
圖3:Factory 方法的拓展UML圖
總結:把“共性”提取出來,根據各自的“個性”建立各自的繼承共性的實現
3. 抽象工廠設計模式
所謂抽象工廠是指一個工廠等級結構可以建立出分屬於不同產品等級結構的一個產品族中的所有對象,以建立Unix控制項和Windows控制項為例說明,我們需要一個抽象工廠下面有兩個子工廠,一個叫做UnixFactory,用於生產Unix族控制項,一個叫做WinFactory,用於生產Win族控制項。抽象工廠與Factory 方法的區別是,Factory 方法中的具體工廠一般只生產一個或幾個控制項對象,而抽象工廠中的具體工廠生產的是一族控制項對象。4所示。
圖4:抽象工廠設計模式UML圖
抽象工廠中的參與者:
抽象工廠(Abstract Factory)角色:擔任這個角色的是Factory 方法模式的核心,它是與應用系統商業邏輯無關的。
具體工廠(Concrete Factory)角色:這個角色直接在用戶端的調用下建立產品的執行個體。這個角色含有選擇合適的產品對象的邏輯,而這個邏輯是與應用系統的商業邏輯緊密相關的。
抽象產品(Abstract Product)角色:擔任這個角色的類是Factory 方法模式所建立的對象的父類,或它們共同擁有的介面。
具體產品(Concrete Product)角色:抽象原廠模式所建立的任何產品對象都是某一個具體產品類的執行個體。這是用戶端最終需要的東西,其內部一定充滿了應用系統的商業邏輯。
抽象工廠的使用情境:
- 一個系統不應當依賴於產品類執行個體如何被建立、組合和表達的細節,這對於所有形態的原廠模式都是重要的。
- 這個系統有多於一個的產品族,而系統只消費其中某一產品族。
- 同屬於同一個產品族的產品是在一起使用的,這一約束必須在系統的設計中體現出來。
- 系統提供一個產品類的庫,所有的產品以同樣的介面出現,從而使用戶端不依賴於實現。
抽象原廠模式與Factory 方法模式的區別
Factory 方法模式:每個抽象產品派生多個具體產品類,每個抽象工廠類派生多個具體工廠類,每個具體工廠類負責一個具體產品的執行個體建立;
抽象原廠模式:每個抽象產品派生多個具體產品類,每個抽象工廠派生多個具體工廠類,每個具體工廠負責多個(一系列)具體產品的執行個體建立。
ios 工廠設計模式