Java設(shè)計模式之工廠方法模式詳解
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í)功能類似。工廠即一個工廠類,提供獲得對象(產(chǎn)品)的方法(工廠方法)。其他類(消費(fèi)者)需要用到某個對象時,只需調(diào)用工廠方法就行,不必new這個對象。
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 {
/**
* 對外提供產(chǎn)品的抽象方法
* @return
*/
public abstract Tyre getTyre();
}
4)具體構(gòu)造類
/**
* 具體構(gòu)造類
*/
public class BydCar extends Car {
/**
* 對外提供獲得對象的方法。
* 當(dāng)用戶想要獲得某個產(chǎn)品時,可以通過相應(yīng)的工廠方法來獲取,而不是直接通過new的方式。
* 優(yōu)點(diǎn):避免用戶通過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)點(diǎn)
1)可以讓用戶代碼和某個特定對象的子類的代碼解耦
2)用戶不必關(guān)心他所使用的對象是如何創(chuàng)建的,只需要知道該對象有哪些方法可供調(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接口中定義了一個 iterator方法,返回Iterator接口的實(shí)例。
Iterator接口----抽象產(chǎn)品
Iterator的實(shí)現(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根據(jù)模板導(dǎo)出PDF的詳細(xì)實(shí)現(xiàn)過程
前段時間因?yàn)橄嚓P(guān)業(yè)務(wù)需求需要后臺生成pdf文件,所以下面這篇文章主要給大家介紹了關(guān)于java根據(jù)模板導(dǎo)出PDF的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-02-02
IDEA插件EasyCode及MyBatis最優(yōu)配置步驟詳解
這篇文章主要介紹了IDEA插件EasyCode MyBatis最優(yōu)配置步驟詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12
springboot設(shè)置了server.port但是沒有用,還是8080問題
這篇文章主要介紹了springboot設(shè)置了server.port但是沒有用,還是8080問題的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
VSCode+Gradle搭建Java開發(fā)環(huán)境實(shí)現(xiàn)
這篇文章主要介紹了VSCode+Gradle搭建Java開發(fā)環(huán)境實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
Java中HashMap和Hashtable及HashSet的區(qū)別
以下是對Java中HashMap和Hashtable及HashSet的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下2013-09-09
Java并發(fā)volatile可見性的驗(yàn)證實(shí)現(xiàn)
這篇文章主要介紹了Java并發(fā)volatile可見性的驗(yàn)證實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
淺談Java中BIO、NIO和AIO的區(qū)別和應(yīng)用場景
這篇文章主要介紹了Java中BIO、NIO和AIO的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04

