Java 深入探究講解抽象工廠模式
解決工廠方法模式的問題:一個具體工廠只能創(chuàng)建一類產(chǎn)品,而實際過程中一個工廠往往需要生成很多的產(chǎn)品,這種可以采用抽象工廠模式。
1. 抽象工廠模式解決
定義:提供一個創(chuàng)建一系列相關(guān)或者互相依賴對象的接口,無需指定他們的具體的類,具體的工廠負(fù)責(zé)實現(xiàn)具體的產(chǎn)品的實例。使一個工廠可以產(chǎn)生多個產(chǎn)品。
2. 抽象工廠類圖UML
3. 抽象工廠模式的主要角色
抽象工廠(AbstractFactory):提供了創(chuàng)建產(chǎn)品的接口,包含了多個創(chuàng)建產(chǎn)品的接口方法,可以創(chuàng)建多個不同等級的產(chǎn)品
具體工廠(ConcreteFactory):實現(xiàn)了抽象工廠定義的方法,完成具體產(chǎn)品的創(chuàng)建
抽象產(chǎn)品(Product):定義了產(chǎn)品的規(guī)范,描述產(chǎn)品的主要特征和性能
具體產(chǎn)品(ConcreteProduct):實現(xiàn)了抽象產(chǎn)品的定義的方法,有具體工廠來創(chuàng)建產(chǎn)品,具體工廠和具體產(chǎn)品一對多關(guān)系
4. 代碼實現(xiàn)
抽象工廠方法實現(xiàn):
public interface AbstractFactory { public Product1 createProduct1(); public Product2 createProduct2(); } ? public class ConcreteFactory1 implements AbstractFactory { @Override public Product1 createProduct1() { System.out.println("具體工廠1產(chǎn)生具體產(chǎn)品1..."); return new ConcreteProduct1(); } ? @Override public Product2 createProduct2() { System.out.println("具體工廠1產(chǎn)生具體產(chǎn)品2..."); return new ConcreteProduct2(); } }
使用步驟:
- 創(chuàng)建抽象產(chǎn)品類,定義產(chǎn)品的公共方法
- 創(chuàng)建具體產(chǎn)品類(實現(xiàn)抽象產(chǎn)品接口),定義生成的具體產(chǎn)品
- 創(chuàng)建抽象工廠類,定義具體工廠的公共接口,一個工廠類可以創(chuàng)建不同等級的產(chǎn)品
- 創(chuàng)建具體工廠類,定義創(chuàng)建對應(yīng)具體產(chǎn)品實例的方法
- 調(diào)用方調(diào)用具體的工廠類的方法,從而創(chuàng)建不同具體產(chǎn)品的實例
5. 抽象工廠方法再探究
解決問題:每個工廠只能創(chuàng)建一類產(chǎn)品,即是工廠方法的缺點
6. 優(yōu)缺點
優(yōu)點:
- 可以在工廠類內(nèi)部對產(chǎn)品中相關(guān)聯(lián)的多級產(chǎn)品共同管理,而不必專門引入新的類來管理
- 抽象工廠增加了程序的可擴(kuò)展性,當(dāng)新增一個新的產(chǎn)品族時,不需要修改源代碼,滿足開閉原則
缺點:
- 當(dāng)產(chǎn)品族新增一個產(chǎn)品類型時,所有的工廠類都需要進(jìn)行修改,增加了系統(tǒng)的抽象性和理解難度
7. 適用示例
王者榮耀中提供了很多的英雄,英雄分為射手、輔助、打野、坦克等職業(yè),不同的職業(yè)對應(yīng)的技能,屬性不同。聲明坦克、法師、刺客等多個工廠子類,每個工廠可以生產(chǎn)相應(yīng)技能的應(yīng)用。
到此這篇關(guān)于Java 例舉講解抽象工廠模式的文章就介紹到這了,更多相關(guān)Java 抽象工廠內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot2 整合Ehcache組件,輕量級緩存管理的原理解析
這篇文章主要介紹了SpringBoot2 整合Ehcache組件,輕量級緩存管理,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08maven?scope?provided和runtime的例子說明
這篇文章主要介紹了maven?scope?provided和runtime的例子說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12深入學(xué)習(xí)MyBatis中的參數(shù)(推薦)
大家日常使用MyBatis經(jīng)常會遇到一些異常,想要避免參數(shù)引起的錯誤,我們需要深入了解參數(shù)。想了解參數(shù),我們首先看MyBatis處理參數(shù)和使用參數(shù)的全部過程。下面這篇文章主要給大家介紹了MyBatis中參數(shù)的的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-06-06springMVC如何將controller中數(shù)據(jù)傳遞到j(luò)sp頁面
這篇文章主要介紹了springMVC如何將controller中數(shù)據(jù)傳遞到j(luò)sp頁面,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07