Java設計模式 工廠方法

2021-09-23 18:48:14 字數 3625 閱讀 5401

定義乙個用於建立物件的介面,factory method將乙個類的例項化延遲到了子類。

工廠方法模式的功能

工廠方法的主要功能是讓父類在不知道具體實現的情況下,完成自身的功能呼叫,而具體的實現延遲到子類來實現。

實現成抽象類

工廠方法的實現中,通常父類會是乙個抽象類,裡面包含建立所需物件的抽象方法,這些抽象方法就是工廠方法

實現成具體的類

也可以把父類實現成為乙個具體的類,這種情況下,通常是在父類中提供獲取所需物件的預設實現方法,這樣就算沒有具體的子類,也能夠執行。

工廠方法的引數和返回值

工廠方法的實現中,可能需要引數,以便決定到底選用哪一種具體的實現。一般工廠方法返回的是被建立物件的介面物件,當然也可以是抽象類或者乙個具體的類的例項。

誰來使用工廠方法建立的物件

(1)在工廠方法模式裡面,應該是creator中的其它方法在使用工廠方法建立的物件

(2)客戶端應該是使用creator物件,或者是使用由creator建立出來的物件,這個時候工廠方法建立的物件,是creator中的某些方法使用。

(3)在某些情況下,客戶端可能會使用由creator建立出來的物件,這個時候工廠方法建立的物件,是構成客戶端需要的物件的一部分。

工廠方法模式的本質

延遲到子類來選擇實現

對設計原則的體現

工廠方法模式很好的體現了「依賴倒置原則」 。依賴倒置原則告訴我們「要依賴抽象,不要依賴於具體類」,簡單點說就是:不能讓高層元件依賴於低層元件,而且不管高層元件還是低層元件,都應該依賴於抽象。

何時選用工廠方法模式

如果乙個類需要建立某個介面的物件,但是又不知道具體的實現,這種情況可以選用工廠方法模式,把建立物件的工作延遲到子類去實現

如果乙個類本身就希望,由它的子類來建立所需的物件的時候,應該使用工廠方法模式

工廠方法模式的呼叫順序示意圖

客戶端使用由creator建立出來的物件情況的呼叫順序示意圖

客戶端使用creator物件時候的呼叫順序示意圖

定義工廠方法所建立的物件的介面,也就是實際需要使用的物件的介面

concreteproduct:

具體的product介面的實現物件。

creator:

建立器,宣告工廠方法

concretecreator:

具體的建立器物件,覆蓋實現creator定義的工廠方法,返回具體的product例項

可以在不知具體實現的情況下程式設計

更容易擴充套件物件的新版本

連線平行的類層次

具體產品物件和工廠方法的耦合性

工廠方法模式與ioc/di

(1)概念

依賴注入:應用程式依賴容器建立並注入它所需要的外部資源

控制反**容器控制應用程式,由容器反向的向應用程式注入應用程式所需要的外部資源。

(2)過程

沒有ioc/di的時候,常規的a類使用c類的示意圖

有了ioc/di的容器後,a類不再主動去建立c了

而是被動等待,等待ioc/di的容器獲取乙個c的例項,然後反向的注入到a類中

(3)思想

其實ioc/di對程式設計帶來的最大改變不是從**上,而是從思想上,發生了「主從換位」的變化。應用程式原本是老大,要獲取什麼資源都是主動出擊,但是在ioc/di思想中,應用程式就變成被動的了,被動的等待ioc/di容器來建立並注入它所需要的資源了。

這麼小小的乙個改變其實是程式設計思想的乙個大進步,這樣就有效的分離了物件和它所需要的外部資源,使得它們鬆散耦合,有利於功能復用,更重要的是使得程式的整個體系結構變得非常靈活。

(4)工廠方法模式和ioc/di的關係

他們的思想很類似,都是「主動變被動」,進行「主從換位」,從而獲得更靈活的程式結構

平行的類層次結構

(1)什麼是平行的類層次結構呢?

簡單點說,假如有兩個類層次結構,其中乙個類層次中的每個類在另乙個類層次中都有乙個對應的類的結構,就被稱為平行的類層次結構。

(2)這種平行的類層次結構用來幹什麼呢?

主要用來把乙個類層次中的某些行為分離出來,讓類層次中的類把原本屬於自己的職責,委託給分離出來的類去實現,從而使得類層次本身變得更簡單,更容易擴充套件和復用。

(3)工廠方法模式跟平行的類層次結構有何關係呢?

可以使用工廠方法模式來連線平行的類層次。

引數化工廠方法

所謂引數化工廠方法指的就是:通過給工廠方法傳遞引數,讓工廠方法根據引數的不同來建立不同的產品物件。

/**

* 匯出的檔案物件的介面

*/public inte***ce exportfileapi

/** * 實現匯出資料的業務功能物件

*/public abstract class exportoperate

/*** 工廠方法,建立匯出的檔案物件的介面物件

* @return 匯出的檔案物件的介面物件

*/protected abstract exportfileapi factorymethod();

//既要約束子類的行為,又要為子類提供公共的功能

}/**

* 匯出成資料庫備份檔案形式的物件

*/public class exportdb implements exportfileapi

}/**

* 具體的建立器實現物件,實現建立匯出成資料庫備份檔案形式的物件

*/public class exportdboperate extends exportoperate

}/**

* 匯出成文字檔案格式的物件

*/public class exportxmlfile implements exportfileapi

}/**

* 匯出成文字檔案格式的物件

*/public class exportxmlfileoperate extends exportoperate

}

Java設計模式 工廠方法模式

定義乙個用於建立物件的介面,讓子類決定將哪乙個類例項化。factory method 使乙個類的例項化延遲到其子類。package car inte ce public inte ce icar inte ce package car imple import car inte ce.icar in...

Java設計模式 工廠方法模式

工廠方法模式應用背景 客戶類不關心使用哪個具體的類,只關心介面所提供的功能。建立過程比較複雜,例如需要初始化其他關聯的資源類。介面或者抽象類有許多實現類,客戶 需要編寫大量if else邏輯來決定執行時使用哪個具體的實現類。不希望給客戶程式暴露太多的類的內部結構,這樣做可以降低耦合度。優化效能,比如...

java設計模式 工廠方法模式

簡單工廠模式的應用就是用來建立乙個物件,簡單工廠模式是將所有物件的初始化集於乙個具體的工廠類來實現,這個工廠類負責所有產品的建立,但是這種建立只能建立單一的產品,如簡單工廠模式裡的chickenfactory這種工廠只能生產雞肉這個系列的產品,而當需求發生變化時簡單工廠模式就無法應對了。例如 我再一...