天天看點

設計模式:如何優雅地使用工廠模式

本文從是什麼、為什麼、怎麼做的三個步驟,分析簡單工廠模式、工廠方法模式和抽象工廠模式,通過架構源碼學習如何優雅地使用工廠模式。

關于什麼是工廠模式這個問題呢?其實完全可以見名知意,工廠是做什麼的?工廠是生産産品的地方啊,那麼映射到程式設計領域,工廠模式不就是生産對象的一種模式嘛?借用百度百科的一句話來說:工廠模式是我們最常用的執行個體化對象模式了,是用工廠方法代替new操作的一種模式。

工廠模式,按照業務實際場景可以劃分為3中不同的實作方式,分别是簡單工廠模式、工廠方法模式和抽象方法模式。

簡單工廠模式又叫靜态工廠方法模式,簡單來說就是,該模式有一個具體的工廠類,可以生産許多不同的産品。有一件有意思的事情,簡單工廠模式其實不是一種設計模式(不屬于GoF23種設計模式),更像是一種程式設計等習慣,但是由于該習慣經常被使用,許多開發人員都把它稱為”工廠模式“,那麼就”将錯就錯“被大家所接受咯。

在簡單工廠模式中,生産産品是由一個單一的、具體的工廠類來實作的;在工廠方法模式中,不再采用這種方式,而是由工廠類的子類實作具體産品的生産工作。當增加一類産品的時候,隻需要增加一個相應的工廠類的子類。這樣做的好處是可以解決簡單工廠模式由于生産産品種類過多而引發的代碼臃腫的問題。舉個例子,需要建立3種類型的産品,簡單工廠模式需要3個分支(不管是if-else也好,switch-case也罷),工廠方法模式需要3個子類;那麼産品類型有10種呢?當生産的産品種類較多的時候,使用工廠方法模式可以解決簡單工廠方法模式大量代碼重複的問題,這也就是工廠方法模式存在的意義。

抽象工廠模式是這麼定義的:抽象工廠模式提供一個接口,用于建立相關或依賴對象的家族,而不需要明确執行具體類。抽象工廠允許客戶使用抽象的接口來建立一組相關的産品,而不需要關系實際産出的具體産品是什麼。

”為什麼要使用工廠模式“,關于這個問題我是這麼了解的:

第一,為什麼要使用設計模式?逼格,對,設計模式就是逼格的展現。除了逼格,說的實際點,就是可以使代碼變得清晰和優雅,讓新人接手代碼的時候在心裡少罵我們幾句。

第二,主要的目的還是解耦。如果沒有簡單工廠模式,我們需要關心生産邏輯(建立過程)和調用,可以使用一坨代碼去實作,此時這二者是沒有分開的;當使用了簡單工廠模式,具體的生産邏輯放在了簡單工廠裡面,隻需要調用即可;當品類增多,簡單工廠的工廠類的邏輯變得複雜,耦合變得嚴重,出現工廠方法模式,将不同品類的生産邏輯剝離到子類中進行,讓外部隻是知道如何調用即可,實作解耦....其實從不使用設計模式--> 簡單工廠模式--> 工廠方法模式-->抽象工廠模式,這就是層次遞進的解耦關系。那為什麼需要使用工廠模式呢,我想本質也就在這裡吧。

關于如何使用工廠模式?不寫之前的demo了,來看下優秀的架構中是如何使用工廠模式的。

簡單工廠模式java.util.Calendar類中的運用:

Logback源碼中的工廠方法模式的使用:

在Spring源碼中,所有工廠都是BeanFactory的子類。通過對BeanFactory的實作,我們可以從Spring的容器通路Bean。根據不同的政策調用getBean()方法,進而獲得具體對象。

由于部落客也是在攀登的路上,文中可能存在不當之處,歡迎各位多指教! 如果文章對您有用,那麼請點個”推薦“,以資鼓勵!