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

