Java 深入探究講解工廠方法模式
1. 工廠方法模式介紹
定義:工廠方法模式是對(duì)簡(jiǎn)單工廠模式進(jìn)一步的抽象化,好處是可以使系統(tǒng)不修改原來(lái)代碼的情況下引進(jìn)新的產(chǎn)品,即滿足開閉原則。定義一個(gè)用于創(chuàng)建對(duì)象接口,讓子類決定實(shí)例化哪一個(gè)類,使一個(gè)類的實(shí)例化延遲到子類中。
2. 工廠方法模式類圖UML
3. 工廠方法模式角色說(shuō)明
抽象工廠(AbstractFactory):提供了創(chuàng)建產(chǎn)品的接口,調(diào)用方通過它訪問具體工廠的工廠方法來(lái)創(chuàng)建產(chǎn)品
具體工廠(ConcreteFactory):實(shí)現(xiàn)了抽象工廠定義的方法,完成具體產(chǎn)品的創(chuàng)建
抽象產(chǎn)品(Product):定義了產(chǎn)品的規(guī)范,描述產(chǎn)品的主要特征和性能
具體產(chǎn)品(ConcreteProduct):實(shí)現(xiàn)了抽象產(chǎn)品的定義的方法,有具體工廠來(lái)創(chuàng)建產(chǎn)品,具體工廠和具體產(chǎn)品一一對(duì)應(yīng)
4. 代碼實(shí)現(xiàn)
工廠方法模式實(shí)現(xiàn):
/** * 抽象工廠:提供具體工廠的共有方法 */ public interface Product { public void show(); } ? public class ConcreteProduct1 implements Product { @Override public void show() { System.out.println("具體產(chǎn)品1展示..."); } } ? public class ConcreateProduct2 implements Product { @Override public void show() { System.out.println("具體產(chǎn)品2展示..."); } } ? ? /** * 抽象工廠 */ public interface AbstractFactory { public Product createProduct(); } ? /** * 具體工廠1產(chǎn)生具體產(chǎn)品1 */ public class ConcreteFactory1 implements AbstractFactory { @Override public Product createProduct() { ConcreteProduct1 concreteProduct1 = new ConcreteProduct1(); System.out.println("具體工廠1創(chuàng)建具體產(chǎn)品1..."); return concreteProduct1; } public class ConcreteFactory2 implements AbstractFactory { @Override public Product createProduct() { System.out.println("具體工廠2產(chǎn)生具體產(chǎn)品2..."); return new ConcreateProduct2(); } }
調(diào)用方法:
//獲取具體產(chǎn)品1 Product product = new ConcreteFactory1().createProduct(); product.show(); ? Product product1 = new ConcreteFactory2().createProduct(); product1.show();
使用步驟:
- 創(chuàng)建抽象產(chǎn)品類,定義產(chǎn)品的公共方法
- 創(chuàng)建具體產(chǎn)品類(實(shí)現(xiàn)抽象產(chǎn)品接口),定義生成的具體產(chǎn)品
- 創(chuàng)建抽象工廠類,定義具體工廠的公共接口
- 創(chuàng)建具體工廠類,定義創(chuàng)建對(duì)應(yīng)具體產(chǎn)品實(shí)例的方法
- 調(diào)用方調(diào)用具體的工廠類的方法,從而創(chuàng)建不同具體產(chǎn)品的實(shí)例
5. 工廠模式再探究
解決問題:解決了簡(jiǎn)單工廠類新增產(chǎn)品需要修改工廠類的方法邏輯問題,即為別開閉原則。
將具體的產(chǎn)品創(chuàng)建退出到工廠類的子類(具體工廠),此時(shí)工廠類不再負(fù)責(zé)所有產(chǎn)品的創(chuàng)建,而是給出具體工廠必須實(shí)現(xiàn)的接口,這樣工廠方法在添加新的產(chǎn)品的時(shí)候,就不需要修改工廠類的邏輯,而是添加了新的工廠子類,符合開閉原則。
6. 優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
- 靈活性強(qiáng),對(duì)于新產(chǎn)品的創(chuàng)建,只需要多寫一個(gè)對(duì)應(yīng)的工廠類
- 用戶只需要指導(dǎo)工廠的名稱就可以獲得所要的產(chǎn)品,不需要指導(dǎo)產(chǎn)品具體創(chuàng)建過程
缺點(diǎn):
- 類的個(gè)數(shù)容易過多,增加了復(fù)雜度
- 每一個(gè)工廠只能生產(chǎn)一種產(chǎn)品,次弊端可以使用抽象工廠模式解決
7. 應(yīng)用場(chǎng)景
客戶只關(guān)注創(chuàng)建產(chǎn)品的工廠名,不需要知道具體的產(chǎn)品名稱
到此這篇關(guān)于Java 深入探究講解工廠方法模式的文章就介紹到這了,更多相關(guān)Java 工廠方法 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決SpringBoot中使用@Transactional注解遇到的問題
這篇文章主要介紹了SpringBoot中使用@Transactional注解遇到的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09jenkins+Maven從SVN上構(gòu)建項(xiàng)目的方法
這篇文章主要介紹了jenkins+Maven從SVN上構(gòu)建項(xiàng)目,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09java實(shí)現(xiàn)的海盜算法優(yōu)化版
這篇文章主要介紹了java實(shí)現(xiàn)的海盜算法優(yōu)化版,結(jié)合實(shí)例形式分析了java海盜算法的具體實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-07-07利用Java實(shí)現(xiàn)帶GUI的氣泡詩(shī)詞特效
這篇文章主要為大家介紹了如何利用Java語(yǔ)言實(shí)現(xiàn)帶GUI的氣泡詩(shī)詞特效,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Java有一定幫助,感興趣的可以了解一下2022-08-08springboot2中session超時(shí),退到登錄頁(yè)面方式
這篇文章主要介紹了springboot2中session超時(shí),退到登錄頁(yè)面方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01