Java設(shè)計(jì)模式之工廠方法模式詳解
1.工廠方法是什么
眾所周知,工廠是生產(chǎn)產(chǎn)品的,并且產(chǎn)品供消費(fèi)者使用。消費(fèi)者不必關(guān)心產(chǎn)品的生產(chǎn)過(guò)程,只需要關(guān)心用哪種產(chǎn)品就行。
在Java世界中,工廠方法模式和現(xiàn)實(shí)功能類(lèi)似。工廠即一個(gè)工廠類(lèi),提供獲得對(duì)象(產(chǎn)品)的方法(工廠方法)。其他類(lèi)(消費(fèi)者)需要用到某個(gè)對(duì)象時(shí),只需調(diào)用工廠方法就行,不必new這個(gè)對(duì)象。
2.如何實(shí)現(xiàn)
1)創(chuàng)建產(chǎn)品的抽象類(lèi)或接口---抽象產(chǎn)品
2)創(chuàng)建具體產(chǎn)品的類(lèi)---具體產(chǎn)品
3)創(chuàng)建工廠的抽象類(lèi)或接口---抽象構(gòu)造類(lèi)
4)創(chuàng)建具體工廠類(lèi)---具體構(gòu)造類(lèi)
3.代碼實(shí)現(xiàn)
比如想要獲得車(chē)的參數(shù)信息,輪胎信息等。
1)抽象產(chǎn)品
/**
* 產(chǎn)品抽象類(lèi)
*/
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)造類(lèi)
/**
* 抽象構(gòu)造類(lèi)
*/
public abstract class Car {
/**
* 對(duì)外提供產(chǎn)品的抽象方法
* @return
*/
public abstract Tyre getTyre();
}
4)具體構(gòu)造類(lèi)
/**
* 具體構(gòu)造類(lèi)
*/
public class BydCar extends Car {
/**
* 對(duì)外提供獲得對(duì)象的方法。
* 當(dāng)用戶(hù)想要獲得某個(gè)產(chǎn)品時(shí),可以通過(guò)相應(yīng)的工廠方法來(lái)獲取,而不是直接通過(guò)new的方式。
* 優(yōu)點(diǎn):避免用戶(hù)通過(guò)new來(lái)獲取對(duì)象,讓用戶(hù)代碼和產(chǎn)品代碼解耦。
* @return
*/
@Override
public Tyre getTyre() {
return new MichelinTyre();
}
}5)測(cè)試類(lèi)
/**
* 測(cè)試類(lèi)
*/
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)可以讓用戶(hù)代碼和某個(gè)特定對(duì)象的子類(lèi)的代碼解耦
2)用戶(hù)不必關(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)類(lèi)---具體產(chǎn)品
Collection接口---抽象構(gòu)造
LinkedList鏈表類(lèi)--具體構(gòu)造類(lèi)
到此這篇關(guān)于Java設(shè)計(jì)模式之工廠方法模式詳解的文章就介紹到這了,更多相關(guān)Java工廠方法模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java編程創(chuàng)建型設(shè)計(jì)模式工廠方法模式示例詳解
- java設(shè)計(jì)模式之工廠方法模式
- java設(shè)計(jì)模式學(xué)習(xí)之工廠方法模式
- java設(shè)計(jì)模式之工廠方法模式
- Java使用設(shè)計(jì)模式中的工廠方法模式實(shí)例解析
- Java設(shè)計(jì)模式編程之工廠方法模式的使用
- Java設(shè)計(jì)模式編程中的工廠方法模式和抽象工廠模式
- Java設(shè)計(jì)模式之工廠方法模式實(shí)例簡(jiǎn)析
- Java創(chuàng)建型設(shè)計(jì)模式之工廠方法模式深入詳解
相關(guān)文章
java執(zhí)行SQL語(yǔ)句實(shí)現(xiàn)查詢(xún)的通用方法詳解
這篇文章主要介紹了java執(zhí)行SQL語(yǔ)句實(shí)現(xiàn)查詢(xún)的通用方法詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-12-12
使用FeignClient設(shè)置動(dòng)態(tài)Url
這篇文章主要介紹了使用FeignClient設(shè)置動(dòng)態(tài)Url方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
關(guān)于Java Interface接口的簡(jiǎn)單練習(xí)題
這篇文章主要給大家分享的是關(guān)于Java Interface接口的簡(jiǎn)單練習(xí)題,難度不算大,但是要有一個(gè)清晰的邏輯建立接口和鏈接Java類(lèi)。下面來(lái)看看文章的詳細(xì)介紹吧,需要的朋友可以參考一下2021-11-11
HttpServletRequest對(duì)象方法的用法小結(jié)
HttpServletRequest對(duì)象代表客戶(hù)端的請(qǐng)求,當(dāng)客戶(hù)端通過(guò)HTTP協(xié)議訪問(wèn)服務(wù)器時(shí),HTTP請(qǐng)求頭中的所有信息都封裝在這個(gè)對(duì)象中,開(kāi)發(fā)人員通過(guò)這個(gè)對(duì)象的相關(guān)方法,即可以獲得客戶(hù)的這些信息2017-03-03
深入理解Java嵌套類(lèi)和內(nèi)部類(lèi)
本篇文章主要介紹了深入理解Java嵌套類(lèi)和內(nèi)部類(lèi),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05
解決ThingsBoard編譯報(bào)錯(cuò)問(wèn)題:Failure?to?find?org.gradle:gradle-too
這篇文章主要介紹了ThingsBoard編譯報(bào)錯(cuò):Failure?to?find?org.gradle:gradle-tooling-api:jar:6.3,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03

