摘要:簡單工廠,工廠模式和抽象工廠。不要認(rèn)為簡單工廠是用就覺得一無是處,也不要覺得抽象工廠比較高大上就到處套。
工廠模式,實(shí)際上也會根據(jù)業(yè)務(wù)情景不同會有不同的實(shí)現(xiàn)方式。一般分為3種。簡單工廠,工廠模式和抽象工廠。顧名思義,這三種從簡單到抽象,名稱越來越高大上,實(shí)現(xiàn)方式肯定是越來越復(fù)雜
結(jié)論1:三種工廠的實(shí)現(xiàn)越來越復(fù)雜
簡單工廠public class Factory { // 定義產(chǎn)品編號 public int prodNo; // 構(gòu)造工廠時告知工廠產(chǎn)品標(biāo)識 public Factory(int prodNo) { this.prodNo = prodNo; } public IProduct GetProduct() { // 根據(jù)產(chǎn)品標(biāo)識生產(chǎn)產(chǎn)品 switch (prodNo) { case prodNo1: return new ProductA(); break; case prodNo2: return new ProductB(); break; default: ... } } } // 產(chǎn)品A class ProductA implements IProduct { //產(chǎn)品屬性 //...... } //產(chǎn)品B class ProductB implements IProduct { //產(chǎn)品屬性 //...... } //產(chǎn)品接口 public interface IProduct { //產(chǎn)品方法 //...... }
簡單工廠的問題就在于swich case(或者if else)。每當(dāng)新增一種產(chǎn)品時,你都需要去維護(hù)工廠中的判斷語句,造成該工廠類不斷增長,各種判斷擠在一起,給擴(kuò)展和維護(hù)帶來麻煩。產(chǎn)品和工廠沒有實(shí)現(xiàn)完全解耦,綁定在一起
結(jié)論2:簡單工廠通過構(gòu)造時傳入的標(biāo)識來生產(chǎn)產(chǎn)品,不同產(chǎn)品都在同一個工廠中生產(chǎn),這種判斷會隨著產(chǎn)品的增加而增加,給擴(kuò)展和維護(hù)帶來麻煩
工廠模式// 工廠接口 interface IFactory { IProduct GetProduct(); } // A工廠類 class FactoryA implements IFactory { IProduct productA; public FactoryA() { this.productA = new ProductA(); } public IProduct GetProduct() //A工廠生產(chǎn)A產(chǎn)品 { return this.productA; } } //B工廠類 class FactoryB implements IFactory { IProduct productB; public FactoryB() { this.productB = new ProductB(); } public IProduct GetProduct() //B工廠生產(chǎn)B產(chǎn)品 { return this.productB; } } //產(chǎn)品接口 interface IProduct { //產(chǎn)品方法 //...... } //產(chǎn)品A class ProductA implements IProduct { //產(chǎn)品屬性 //...... } //產(chǎn)品B class ProductB implements IProduct { //產(chǎn)品屬性 //...... }
在工廠模式中,已經(jīng)將工廠類分開,不再將所有產(chǎn)品在同一工廠中生產(chǎn),解決了簡單工廠中不斷增加的switch case的問題。如再新增一個C產(chǎn)品,那么只需寫一個C工廠和C產(chǎn)品,在調(diào)用時用C工廠生產(chǎn)C產(chǎn)品即可,A和B工廠和產(chǎn)品完全不受影響
結(jié)論3:工廠模式無法解決產(chǎn)品族和產(chǎn)品等級結(jié)構(gòu)的問題
抽象工廠實(shí)現(xiàn)不同的產(chǎn)品族,并且實(shí)現(xiàn)產(chǎn)品等級結(jié)構(gòu)
// 工廠接口,即抽象工廠 interface IFactory { IFridge CreateFridge(); IAirCondition CreateAirCondition(); } // 三星的工廠,生產(chǎn)三星的產(chǎn)品族 class SamsungFactory implements IFactory { public IAirCondition CreateAirCondition() { // 三星的工廠生產(chǎn)三星的空調(diào) return new SamsungAirCondition(); } public IFridge CreateFridge() { // 三星的工廠生產(chǎn)三星的冰箱 return new SamsungFridge(); } } // 格力的工廠,生產(chǎn)格力的產(chǎn)品族 class GreeFactry implements IFactory { public IAirCondition CreateAirCondition() { // 格力的工廠生產(chǎn)格力的空調(diào) return new GreeAirCondition(); } public IFridge CreateFridge() { // 格力的工廠生產(chǎn)格力的冰箱 return new GreeFridge(); } } // 冰箱產(chǎn)品接口 interface IFridge { // 冰箱產(chǎn)品接口 // 冰箱的action } // 空調(diào)接口 interface IAirCondition { // 空調(diào)產(chǎn)品接口 // 空調(diào)的action } // 三星的冰箱 public class SamsungFridge implements IFridge { // 三星冰箱的action和property } // 格力的冰箱 public class GreeFridge : IFridge { // 格力冰箱的action和property } // 三星的空調(diào) public class SamsungAirCondition implements IAirCondition { // 三星空調(diào)的action和property } // 格力的空調(diào) public class GreeAirCondition implements IAirCondition { / /格力空調(diào)的action和property }
在工廠模式中,一個工廠生產(chǎn)一個產(chǎn)品,所有的具體產(chǎn)品是由同一個抽象產(chǎn)品派生的,不存在產(chǎn)品等級結(jié)構(gòu)和產(chǎn)品族的概念;而在抽象工廠中,同一個等級的產(chǎn)品是派生于一個抽象產(chǎn)品(即產(chǎn)品接口),一個抽象工廠派生不同的具體工廠,每個具體工廠生產(chǎn)自己的產(chǎn)品族(包含不同產(chǎn)品等級)
結(jié)論4:工廠模式中,一個工廠生產(chǎn)一個產(chǎn)品,所有產(chǎn)品派生于同一個抽象產(chǎn)品(或產(chǎn)品接口);而抽象工廠模式中,一個工廠生產(chǎn)多個產(chǎn)品,它們是一個產(chǎn)品族,不同的產(chǎn)品族的產(chǎn)品派生于不同的抽象產(chǎn)品(或產(chǎn)品接口)
三種工廠模式關(guān)鍵點(diǎn)三種工廠的實(shí)現(xiàn)是越來越復(fù)雜的
簡單工廠通過構(gòu)造時傳入的標(biāo)識來生產(chǎn)產(chǎn)品,不同產(chǎn)品都在同一個工廠中生產(chǎn),這種判斷會隨著產(chǎn)品的增加而增加,給擴(kuò)展和維護(hù)帶來麻煩
工廠模式無法解決產(chǎn)品族和產(chǎn)品等級結(jié)構(gòu)的問題
抽象工廠模式中,一個工廠生產(chǎn)多個產(chǎn)品,它們是一個產(chǎn)品族,不同的產(chǎn)品族的產(chǎn)品派生于不同的抽象產(chǎn)品(或產(chǎn)品接口)
工廠模式問答在上面的代碼中,都使用了接口來表達(dá)抽象工廠或者抽象產(chǎn)品,那么可以用抽象類嗎?有何區(qū)別?
從功能上說,完全可以,甚至可以用接口來定義行為,用抽象類來抽象屬性。抽象類更加偏向于屬性的抽象,而用接口更加偏向行為的規(guī)范與統(tǒng)一。使用接口有更好的可擴(kuò)展性和可維護(hù)性,更加靈活實(shí)現(xiàn)松散耦合,所以編程原則中有一條是針對接口編程而不是針對類編程
到底何時應(yīng)該用工廠模式
根據(jù)具體業(yè)務(wù)需求。不要認(rèn)為簡單工廠是用switch case就覺得一無是處,也不要覺得抽象工廠比較高大上就到處套。我們使用設(shè)計(jì)模式是為了解決問題而不是炫技,所以根據(jù)三種工廠模式的特質(zhì),以及對未來擴(kuò)展的預(yù)期,來確定使用哪種工廠模式
說說你在項(xiàng)目中工廠模式的應(yīng)用
一個旅游產(chǎn)品的B2B網(wǎng)站,根據(jù)不同類型的業(yè)務(wù)形態(tài),產(chǎn)品也是不同的,有國內(nèi)跟團(tuán),出境跟團(tuán),國內(nèi)自由行,出境自由行,郵輪五種產(chǎn)品,并且后面可能還會有門票,酒店,機(jī)票等等產(chǎn)品,其中有些聯(lián)系也有些區(qū)別
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/66493.html
摘要:與以往的使用的方式不同,工廠模式使用工廠實(shí)例化對象。抽象工廠模式亮相抽象工廠模式抽象工廠模式提供一個接口,用于創(chuàng)建相關(guān)或依賴對象的家族,而不需要明確指定具體類。 寫在前面 這篇博文介紹設(shè)計(jì)模式的形式將與其他篇博文不太一樣,這里我們將從一個問題入手,逐步了解到簡單工廠、工廠方法與抽象工廠模式。 PS:這篇博文涉及的內(nèi)容較多,所以篇幅有點(diǎn)長,請耐心閱讀。 為什么要使用工廠模式? 在 OO ...
摘要:我認(rèn)為按書上的順序比較好理解因?yàn)楹唵戊o態(tài)工廠模式是在工廠方法模式上縮減,抽象工廠模式是在工廠方法模式上再增強(qiáng)。所以我就先講工廠方法模式了。抽象工廠模式抽象工廠模式就比較復(fù)雜了,我們一般的應(yīng)用都寫不到。 前言 只有光頭才能變強(qiáng) 回顧前面: 給女朋友講解什么是代理模式 包裝模式就是這么簡單啦 單例模式你會幾種寫法? 昨天寫了單例模式了,今天是時候?qū)懝S模式啦~ 工廠模式我個人認(rèn)為其實(shí)比...
摘要:一簡單工廠定義簡單工廠其實(shí)并不屬于種設(shè)計(jì)模式之一,該模式是工廠方法模式的弱化或者說是工廠方法模式的一種特例,因?yàn)楹唵?,所以稱為簡單工廠模式,也叫做靜態(tài)工廠模式。 一、簡單工廠 定義 簡單工廠其實(shí)并不屬于23種GOF設(shè)計(jì)模式之一,該模式是工廠方法模式的弱化(或者說是工廠方法模式的一種特例),因?yàn)楹唵?,所以稱為簡單工廠模式(Simple Factory Pattern),也叫做靜態(tài)工廠模式...
摘要:又稱為多態(tài)性工廠模式或虛擬構(gòu)造子模式。簡單工廠模式簡單工廠模式簡單工廠模式又稱為靜態(tài)工廠方法模式,它屬于類創(chuàng)建型模式。多態(tài)性設(shè)計(jì)工廠方法模式之所以又被稱為多態(tài)工廠模式,是因?yàn)樗械木唧w工廠類都具有同一抽象父類。 點(diǎn)擊進(jìn)入我的博客 2.1 簡單工廠模式 2.1.1 工廠模式的幾種形態(tài) 工廠模式主要用一下幾種形態(tài): 簡單工廠(Simple Factory):專門定義一個類來負(fù)責(zé)創(chuàng)建其他...
閱讀 895·2021-11-15 11:38
閱讀 2532·2021-09-08 09:45
閱讀 2831·2021-09-04 16:48
閱讀 2579·2019-08-30 15:54
閱讀 944·2019-08-30 13:57
閱讀 1631·2019-08-29 15:39
閱讀 508·2019-08-29 12:46
閱讀 3534·2019-08-26 13:39