本文腦圖
文章插圖
工廠模式簡單來說就是提供一個創建對象的工廠,屬于創建型模式 , 工廠模式又可以分為三種 , 分別是簡單工廠模式(Simple Factory Pattern)、工廠方法模式(Factory Method Pattern)、抽象工廠模式(Abstract Factory) 。
傳送門:代碼實驗02:設計模式-單例模式
簡單工廠模式
- 簡單工廠的定義
在現實生活中就好比一個汽車廠商 , 只要你告訴廠商你要的車是什么顏色的 , 幾個座位 , 多少排量等等參數,那么汽車廠商就可以給你定制出一輛符合你需求的汽車,廠商具備了生產不同汽車的能力 。
- 簡單工廠包含的角色
- Factory:工廠角色負責實現創建所有實例的內部邏輯
- Product:抽象產品角色抽象產品角色是所創建的所有對象的父類,負責描述所有實例所共有的公共接口
- ConcreteProduct:具體產品角色
簡單工廠模式類圖:
文章插圖
public interface Product {void use();}public class ConcreteProductA implements Product {@Overridepublic void use() {System.out.println("使用A產品");}}public class ConcreteProductB implements Product {@Overridepublic void use() {System.out.println("使用B產品");}}public class SimpleFactory {public static Product createProduct(String arg) {if ("A".equals(arg)) {return new ConcreteProductA();} else if("B".equals(arg)) {return new ConcreteProductB();} else {return null;}}public static void main(String[] args) {Product product = createProduct("A");System.out.println(product);}}從代碼可以看出簡單工廠有以下的特點:- 將對象的創建和對象本身的處理業務分離 , 這樣可以降低耦合度,可以兩者修改起來都相對容易 。
- 在調用工廠類方法時,由于是靜態方法使得調用簡單,直接通過類名調用傳入正確的參數即可 。實際開發中可以將參數配置在數據庫或緩存中,只需要修改數據庫或緩存即可得到不同的對象,而不需要修改代碼,但如果新增產品時則需要修改工廠類的邏輯代碼,這一點不符合"開閉"原則 。
- 簡單工廠模式的要點在于:當你需要什么,只需要傳入一個正確的參數,就可以獲取你所需要的對象,而無須知道其創建細節 。
- 簡單工廠的優點
- 簡單工廠的缺點
工廠方法模式工廠方法模式是簡單工廠模式的進一步抽象和推廣 。由于使用了面向對象的多態性,工廠方法模式保持了簡單工廠模式的優點,而且克服了它的缺點 。在工廠方法模式中,核心的工廠類不再負責所有產品的創建 , 而是將具體創建工作交給子類去做 。這個核心類僅僅負責給出具體工廠必須實現的接口,而不負責哪一個產品類被實例化這種細節,這使得工廠方法模式可以允許系統在不修改工廠角色的情況下引進新產品 。
- 工廠方法的定義
工廠方法模式(Factory Method Pattern)又叫虛擬構造函數(VirtualConstructor)模式或者多態性工廠(Polymorphic Factory)模式 。工廠方法模式的用意是定義一個創建產品對象的工廠接口,將實際創建性工作推遲到子類中 。
- 工廠方法包含的角色
- Product:抽象產品
- ConcreteProduct:具體產品
- Factory:抽象工廠
- ConcreteFactory:具體工廠
文章插圖
// 抽象產品public interface Product {void use();}// 具體產品public class ConcreteProduct implements Product {@Overridepublic void use() {System.out.println("具體產品");}}// 抽象工廠public interface AbstractFactory {/*** 工廠方法**/<T extends Product> T factory(Class<T> c);}// 具體工廠public class ConcreteFactory implements AbstractFactory {@Overridepublic <T extends Product> T factory(Class<T> c) {T product = null;try {product = (T) Class.forName(c.getName()).newInstance();} catch (Exception e) {e.printStackTrace();}return product;}// 測試方法public static void main(String[] args) {ConcreteFactory concreteFactory = new ConcreteFactory();ConcreteProduct product = concreteFactory.factory(ConcreteProduct.class);System.out.println(product);}}- 工廠方法的優點
2.優秀的可擴展性 。在增加產品類的情況下,只要適當地修改具體的工廠類或擴展一個工廠類 , 就可以適應變化 。
3.屏蔽產品類 。產品類的實現如何變化,調用者都不需要關心,而只需要關心產品的接口,只要接口保持不變,系統的上層模塊就不需要發生變化 。因為產品的實例化是由工廠類負責的 , 具體生產何種產品對象是由不同的工廠類決定的 。
4.工廠方法模式是典型的解耦框架 。高層模塊只需要知道產品的抽象類,其他的實現類都不用關心 。工廠方法模式符合迪米特法則,也符合依賴倒置原則,只依賴產品類的抽象;另外還符合里氏替換原則,可以使用產品子類替換產品父類 。
- 工廠方法的使用場景
- 工廠方法模式的本質是new一個對象的替代品,因此只要是涉及到生成對象的地方都可以使用 。
- 需要靈活的、可擴展的框架時 , 可以考慮采用工廠方法模式 。
- 工廠方法模式可以用在異構項目中 , 例如,通過WebService與一個非Java的項目交互 。
- 工廠方法模式可以使用在測試驅動開發的框架下 。例如,測試一個類 A,就需要將與類A關聯的類B也同時產生出來 , 使用工廠方法模式可以將類B虛擬出來,避免類A與類B的耦合 。
- 工廠方法的應用實例
日常我們的項目中都會用到日志記錄器 , 我們的日志記錄器可以支持多種方式記錄日志,例如支持將日志記錄到文件中,同時也支持將日志記錄到數據庫中 。
我們看一下使用工廠方法如何設計:
文章插圖
【代碼實驗03 factory是什么意思】
抽象工廠模式抽象工廠模式(Abstract Factory Pattern)是一種比較常用的模式 。
抽象工廠是指抽象工廠模式(Abstract Factory Pattern)是一種比較常用的模式 。
- 抽象工廠包含的角色
- AbstractFactory:抽象工廠該角色是抽象工廠模式的核心 , 與應用系統無關,任何創建對象的工廠類必須實現這個接口 。
- ConcreteFactory:具體工廠該角色實現了抽象工廠接口,含有選擇合適的產品對象的邏輯,并且受到應用程序的調用以創建產品對象 。
- AbstractProduct:抽象產品該角色實現了抽象工廠接口,含有選擇合適的產品對象的邏輯,并且受到應用程序的調用以創建產品對象 。
- Product:具體產品該角色實現了抽象工廠接口,含有選擇合適的產品對象的邏輯,并且受到應用程序的調用以創建產品對象 。
文章插圖
- 抽象工廠模式的優點
- 產品族內的約束為非公開狀態,在不同的工廠中,各種產品可能具有不同的相互依賴關系,這些依賴關系由工廠封裝在其內部,對于工廠的使用者是不可見的 。
- 生產線的擴展非常容易 , 如果要針對同一產品族建立新的生產線,只需要實現產品族中的所有產品接口并建立新的工廠類即可 。
- 抽象工廠模式的缺點
- 抽象工廠模式的適用場景
- 一個系統不應當依賴于產品類實例如何被創建、組合和表達的細節,這對于所有類型的工廠模式都是重要的 。
- 系統中有多于一個的產品族,而每次只使用其中某一產品族 。
- 屬于同一個產品族的產品將在一起使用,這一約束必須在系統的設計中體現出來 。
- 系統提供一個產品類的庫,所有的產品以同樣的接口出現,從而使客戶端不依賴于具體實現 。
- “開閉原則”的傾斜性
- “開閉原則”要求系統對擴展開放,對修改封閉,通過擴展達到增強其功能的目的 。對于涉及到多個產品族與多個產品等級結構的系統,其功能增強包括兩方面:
- 增加產品族:對于增加新的產品族 , 工廠方法模式很好的支持了“開閉原則” , 對于新增加的產品族,只需要對應增加一個新的具體工廠即可,對已有代碼無須做任何修改 。
- 增加新的產品等級結構:對于增加新的產品等級結構,需要修改所有的工廠角色,包括抽象工廠類,在所有的工廠類中都需要增加生產新產品的方法,不能很好地支持“開閉原則” 。
我們看一下DefaultListableBeanFactory這個對象類圖:
文章插圖
是不是有種很熟悉的感覺?由于篇幅有限,下次我們單獨開一篇文章來講Spring中對工廠模式的具體設計 。
我是Seven , 一個不懈努力的程序猿,希望本文能對你有所裨益
- 格力fc代碼什么意思
- 博世壁掛爐er故障代碼什么意思?
- stop:0x0000007b藍屏代碼是什么意思
- fastcode是什么
- 0x0000001e藍屏代碼是什么意思
- 0x00000074藍屏代碼是什么意思
- 可愛的空間留言_qq空間生日的留言代碼簡單可愛一點的
- 友情留言代碼_完整的php&mysql的留言板源代碼,可以運行的
- 燃氣壁掛爐出現e2是怎么回事
- 華羅庚實驗學校_金壇市馬腳山有一個狗場,叫什么名字,從金城鎮華...
