1.1概述 定義一個用於創建對象的介面,讓子類決定實例化哪一個類。Factory Method使一個類的實例化延遲到其子類。這就是工廠方法模式的定義。 得到一個類的子類的實例最常用的辦法就是使用new運算符和該子類的構造方法,但是在某些情況下,用戶可能不應該或無法使用這種辦法來得到一個子類的實例,其 ...
1.1概述
定義一個用於創建對象的介面,讓子類決定實例化哪一個類。Factory Method使一個類的實例化延遲到其子類。這就是工廠方法模式的定義。
得到一個類的子類的實例最常用的辦法就是使用new運算符和該子類的構造方法,但是在某些情況下,用戶可能不應該或無法使用這種辦法來得到一個子類的實例,其原因是系統不允許用戶代碼和該類的子類形成耦合或者用戶不知道該類有哪些子類可用。
例如,有一個筆芯類(PenCore),該類是一個抽象類。假設筆芯類有三個子類,分別是紅筆芯類(RedPenCore)、藍筆芯類(BluePenCore)、黑筆芯類(BlackPenCore),而系統設計的目的是為用戶提供圓珠筆類(BallPen)的子類的實例,即含有筆芯的圓珠筆,也就是說系統想讓用戶使用圓珠筆類的子類的實例來得到筆芯類的子類的實例。
為此,在設計圓珠筆類的同時,決定讓它依賴於筆芯類,並且提供了一個返回筆芯類對象的方法,比如:PenCore getPenCore();
但是圓珠筆類本身並不知道用戶需要哪種顏色的筆芯,即不知道用戶需要筆芯類的哪個子類的實例,因此圓珠筆類將getPenCore()方法設置為抽象方法,並將自己設置為抽象類,要求其子類重寫(覆蓋)getPenCore()方法,並使用getPenCore()方法返回筆芯類的一個特定子類的實例。比如,當用戶需要藍筆芯類的實例時,就不需要使用new運行符和藍筆芯類的構造方法來來創建對象,代替地使用藍筆芯類創建一個對象,該對象調用getPenCore()方法就可以為用戶獲得一個藍筆芯類的實例,用戶可以讓這個實例調用有關方法寫出藍色的字了。具體示意類圖如下圖一所示:
圖一:圓珠筆與筆芯示意類圖
當系統準備為用戶提供某個類的子類的實例,又不想讓用戶代碼和該子類形成耦合時,就可以使用工廠方法模式來設計系統。工廠方法模式的關鍵是在一個介面或抽象類中定義一個抽象方法,該方法返回某個類的子類的實例,該抽象類或介面讓其子類或實現該介面的類通過重寫這個抽象方法返回某個子類的實例。
1.2模式的結構
工廠方法模式結構包括四種角色:
(1)抽象產品(Product):抽象類或介面,負責定義具體產品必須實現的方法;
(2)具體產品(ConcreteProduct):具體產品是一個類,如果Product是一個抽象類,那麼具體產品是Product的子類;如果Product是一個介面,那麼具體產品是實現Product介面的類;
(3)構造者(Creator):一個介面或抽象類。構造者負責定義一個稱作工廠方法的抽象方法,該方法返回具體產品類的實例。
(4)具體構造者(COncreteCreator):如果構造者是一個抽象類,那麼具體構造者就是構造者的子類;如果構造者是一個介面,那麼具體構造者就是實現構造者介面的類。具體構造者重寫工廠方法使該方法返回具體產品的實例。
工廠方法模式結構的類圖如下圖二所示:
圖二:工廠方法模式的類圖
1.3工廠方法模式的優點
(1)使用工廠方法可以讓用戶的代碼和某個特定類的子類的代碼解耦。
(2)工廠方法使用用戶不必知道它所使用的對象是怎樣被創建的,只需知道該對象有哪些方法即可。
1.4適合使用工廠方法模式的情景
(1)用戶需要一個類的子類的實例,但不希望與該類的子類形成耦合。
(2)用戶需要一個類的子類的實例,但用戶不知道該類有哪些子類可用。