java高階設計模式之工廠方法模式
一、定義
定義一個用於建立物件的介面,讓子類決定例項化哪一個類,FactoryMethod使一個類的例項化延遲到其子類。
二、結構和說明
三、簡單例項(直接複製了,不貼圖)
public class ConcreteCreator extends Creator {
@Override
protected Product factoryMethod() {
//重定義工廠方法,返回一個具體的Product物件
return new ConcreteProduct();
}
}
/**
* 具體的Product物件
*
*/
public class ConcreteProduct implements Product {
//實現Product要求的方法
}
/**
* 建立器,宣告工廠方法
*
*/
public abstract class Creator {
/**
* 建立Product的工廠方法
*/
protected abstract Product factoryMethod();
/**
* 示意方法,實現某些功能的方法
*/
public void someOperation() {
//通常在這些方法實現中,需要呼叫工廠方法來獲取Product物件
Product product = factoryMethod();
}
}
/**
* 工廠方法所建立的物件的介面
*
*/
public interface Product {
//可以定義Product的方法
}
- 認識工廠方法模式
1、工廠方法模式的功能
工廠方法的主要功能是讓父類在不知道具體實現的情況下,完成自身的功能呼叫,而具體的實現延遲到子類來實現。
2、實現成抽象類
工廠方法的實現中,通常父類會是一個抽象類,裡面包含建立所需物件的抽象方法,這些抽象方法就是工廠方法。
3、實現成具體的類
也可以把父類實現成為一個具體的類,這種情況下,通常是在父類中提供獲取所需要物件的預設實現方法,這樣就算沒有具體的子類,也能夠執行。
4、工廠方法的引數和返回值
工廠方法的實現中,可能需要引數,以便決定到底選用哪一種具體的實現。一般工廠方法返回的是被建立物件的介面物件,當然也可以是抽象類或者一個具體的類的例項。
5、誰來使用工廠方法建立的物件
(1)在工廠方法模式裡面,應該是Creator中的其它方法在使用工廠方法建立的物件。
(2)客戶端應該是使用Creator物件,或者是使用由Creator創建出來的物件,這個時候工廠方法建立的物件,是Creator中的某些方法使用。
(3)在某些情況下,客戶端可能會使用由Creator創建出來的物件,這個時候工廠方法建立的物件,是構成客戶端需要的物件的一部分。
小結:在工廠方法模式裡面,客戶端要麼使用Creator物件,要麼使用Creator建立的物件,一般客戶端不直接使用工廠方法。當然也可以直接把工廠方法暴露給客戶端操作,但是一般不這麼做。
- 工廠方法模式與IOC/DI
1、概念
依賴注入(DI):應用程式依賴容器建立並注入它所需要的外部資源
控制反轉(Ioc):容器控制應用程式,由容器反向的嚮應用程式注入應用程式所需要的外部資源。
思想:
其實IoC/DI對程式設計帶來的最大改變不是從程式碼上,而是從思想上發生了“主從換位”的變化。應用程式原本是老大,要獲取什麼資源都是主動出擊,但是在IoC/DI思想中,應用程式就程式設計被動的了,被動的等待IoC/DI容器來建立並注入它所需要的資源了。
這麼小小的一個改變其實是程式設計思想的一個大進步,這樣就有效的分離了物件和它所需要的外部資源,使得它們鬆散耦合,有利於功能複用,更重要的是使得程式的整個體系結構變得非常靈活
工廠方法模式和IoC/DI的關係
它們的思想很類似,都是“主動變被動”,進行“主從換位”,從而獲得更靈活的程式結構。
- 平行的類層次結構
(1)、什麼是平行的類層次結構呢?
簡單點說,假如有兩個類層次結構,其中一個類層次中的每個類在另一個類層次中都有一個對應的類的結構,就被稱為平行的類層次結構。
(2)、這種平行的類層次結構用來幹什麼?
主要用來把一個類層次中的某些行為分離出來,讓類層次中的類把原本屬於自己的職責,委託給分離出來的類去實現,從而使得類層次本身變得更簡單,更容易擴充套件和使用。
(3)、工廠方法模式跟平行的類層次結構的關係
可以使用工廠方法模式來連線平行的類層次。
- 其它
引數化工廠方法
所謂引數化工廠方法指的就是:通過給工廠方法傳遞引數,讓工廠方法根據引數的不同來建立不同的產品物件。
工廠方法模式的優缺點
1、可以在不知具體實現的情況下程式設計。
2、更容易擴充套件物件的新版本
3、連線平行的類層次
4、具體產品物件和工廠方法的耦合性
工廠方法模式的本質
延遲到子類來選擇實現
對設計原則的體現
工廠方法模式很好的體現了“依賴倒置原則”
依賴倒置原則告訴我們“要依賴抽象,不要依賴於具體類”,簡單點說就是:不能讓高層元件依賴於低層元件,而且不管高層元件還是低層元件,都應該依賴於抽象。
何時選用工廠方法模式
1、如果一個類需要建立某個介面的物件,但是又不知道具體的實現,這種情況可以選用工廠方法模式,把建立物件的工作延遲到子類去實現
2、如果一個類本身就希望由它的子類來建立所需的物件的時候,應該使用工廠方法模式。
工廠方法模式時序圖: