Java設(shè)計(jì)模式之工廠方法模式詳解
1.工廠方法是什么
眾所周知,工廠是生產(chǎn)產(chǎn)品的,并且產(chǎn)品供消費(fèi)者使用。消費(fèi)者不必關(guān)心產(chǎn)品的生產(chǎn)過程,只需要關(guān)心用哪種產(chǎn)品就行。
在Java世界中,工廠方法模式和現(xiàn)實(shí)功能類似。工廠即一個(gè)工廠類,提供獲得對(duì)象(產(chǎn)品)的方法(工廠方法)。其他類(消費(fèi)者)需要用到某個(gè)對(duì)象時(shí),只需調(diào)用工廠方法就行,不必new這個(gè)對(duì)象。
2.如何實(shí)現(xiàn)
1)創(chuàng)建產(chǎn)品的抽象類或接口---抽象產(chǎn)品
2)創(chuàng)建具體產(chǎn)品的類---具體產(chǎn)品
3)創(chuàng)建工廠的抽象類或接口---抽象構(gòu)造類
4)創(chuàng)建具體工廠類---具體構(gòu)造類
3.代碼實(shí)現(xiàn)
比如想要獲得車的參數(shù)信息,輪胎信息等。
1)抽象產(chǎn)品
/** * 產(chǎn)品抽象類 */ public abstract class Tyre { String name; public abstract void getName(); }
2)具體產(chǎn)品
/** * 具體產(chǎn)品 */ public class MichelinTyre extends Tyre { MichelinTyre(){ name = "米其林輪胎"; } @Override public void getName() { System.out.println("car name :"+name); } }
3)抽象構(gòu)造類
/** * 抽象構(gòu)造類 */ public abstract class Car { /** * 對(duì)外提供產(chǎn)品的抽象方法 * @return */ public abstract Tyre getTyre(); }
4)具體構(gòu)造類
/** * 具體構(gòu)造類 */ public class BydCar extends Car { /** * 對(duì)外提供獲得對(duì)象的方法。 * 當(dāng)用戶想要獲得某個(gè)產(chǎn)品時(shí),可以通過相應(yīng)的工廠方法來獲取,而不是直接通過new的方式。 * 優(yōu)點(diǎn):避免用戶通過new來獲取對(duì)象,讓用戶代碼和產(chǎn)品代碼解耦。 * @return */ @Override public Tyre getTyre() { return new MichelinTyre(); } }
5)測(cè)試類
/** * 測(cè)試類 */ public class Main { public static void main(String args []){ Tyre tyre; Car car = new BydCar(); tyre = car.getTyre(); tyre.getName(); } }
4.工廠方法模式的優(yōu)點(diǎn)
1)可以讓用戶代碼和某個(gè)特定對(duì)象的子類的代碼解耦
2)用戶不必關(guān)心他所使用的對(duì)象是如何創(chuàng)建的,只需要知道該對(duì)象有哪些方法可供調(diào)用即可。
5.拓展
工廠模式在Java集合框架中的應(yīng)用案例
Collection<Integer> list = new LinkedList<Integer>(); for(int i = 0;i<5;i++){ list.add(i); } Iterator<Integer> iterator = list.iterator(); while (iterator.hasNext()){ System.out.println(iterator.next()); }
在Collection接口中定義了一個(gè) iterator方法,返回Iterator接口的實(shí)例。
Iterator接口----抽象產(chǎn)品
Iterator的實(shí)現(xiàn)類---具體產(chǎn)品
Collection接口---抽象構(gòu)造
LinkedList鏈表類--具體構(gòu)造類
到此這篇關(guān)于Java設(shè)計(jì)模式之工廠方法模式詳解的文章就介紹到這了,更多相關(guān)Java工廠方法模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java根據(jù)模板導(dǎo)出PDF的詳細(xì)實(shí)現(xiàn)過程
前段時(shí)間因?yàn)橄嚓P(guān)業(yè)務(wù)需求需要后臺(tái)生成pdf文件,所以下面這篇文章主要給大家介紹了關(guān)于java根據(jù)模板導(dǎo)出PDF的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-02-02IDEA插件EasyCode及MyBatis最優(yōu)配置步驟詳解
這篇文章主要介紹了IDEA插件EasyCode MyBatis最優(yōu)配置步驟詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12springboot設(shè)置了server.port但是沒有用,還是8080問題
這篇文章主要介紹了springboot設(shè)置了server.port但是沒有用,還是8080問題的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12VSCode+Gradle搭建Java開發(fā)環(huán)境實(shí)現(xiàn)
這篇文章主要介紹了VSCode+Gradle搭建Java開發(fā)環(huán)境實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07Java中HashMap和Hashtable及HashSet的區(qū)別
以下是對(duì)Java中HashMap和Hashtable及HashSet的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下2013-09-09Java并發(fā)volatile可見性的驗(yàn)證實(shí)現(xiàn)
這篇文章主要介紹了Java并發(fā)volatile可見性的驗(yàn)證實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05淺談Java中BIO、NIO和AIO的區(qū)別和應(yīng)用場(chǎng)景
這篇文章主要介紹了Java中BIO、NIO和AIO的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04