??????
對
于工廠模式來說,要求高層模塊變化相對較慢,底層模塊變化相對較快。這樣符合設計模式中的依賴倒置原則——高層模塊不依賴于底層模塊。換句話說,軟件設計
是要劃分易變部分和穩定部分。這樣在一些枝節問題發生變化時,主干不用變化。如果是緊耦合狀態,有可能造成一個地方變化,連帶著很多地方要發生變化。
?????? 工廠模式要解決的是“某個對象”的創建工作,由于需求的變化,這個對象常常面臨著劇烈的變化,但是這個對象擁有的接口相對穩定。也就是說:枝節常常發生變化,但是枝節與主干的接口相對穩定。
?????? 《設計模式》中是這樣說明:定義一個用于創建對象的接口,讓子類決定實例化那個類。 FactoryMethod 使得一個類的實例化延遲到子類。
?????? 現在看這句話可能有些不明白,我們一會再來分析一下。先來看看工廠模式的大體結構。如下圖:
??????
我們還是用實例化汽車的例子來解釋。對于客戶端程序(
ClientApp
)如果想要一個汽車的對象,需要調用生產這個汽車的
Factory
的對象。當然,這個類繼承自一個
AbstractFactory
基類。而這個
Factory
類就是《設計模式》中提到的“子類”,它來決定實例化那個類。
?????? 下面我們來具體實現一下代碼,首先,我們需要兩個基類,一個是 Car 的,一個是 Factory 的。 Factory 類型的作用是構建 Car 的對象。代碼如下:
public
abstract
class AbstractCar
??? {
???????
public
abstract
string Run();
???????
public
abstract
string Stop();
???????
public
abstract
string Accelerate();
???????
public
abstract
string Decelerate();
??? }
???
public
abstract
class AbstractFactory
??? {
???????
public
abstract AbstractCar CreateCar();
??? }
???
下面,我們來做一個BMW的實現代碼:
public
class BMWCar:AbstractCar
??? {
???????
public
override
string Run()
??????? {
???????????
return
"BMW Run";
??????? }
???????
public
override
string Stop()
??????? {
???????????
return
"BMW Stop";
??????? }
???????
public
override
string Accelerate()
??????? {
???????????
return
"BMW Accelerate";
??????? }
???????
public
override
string Decelerate()
??????? {
???????????
return
"BMW Decalerate";
??????? }
??? }
???
public
class BMWFactory:AbstractFactory
??? {
???????
public
override AbstractCar CreateCar()
??????? {
???????????
return
new BMWCar();
??????? }
??? }
這樣我們就可以在客戶端程序得到一個BMW的實例,并使用它的方法:
class
Class1
??? {
???????
///
<summary>
???????
///
應用程序的主入口點。
???????
///
</summary>
??????? [STAThread]
???????
static
void
??????? {
??????????? AbstractCar car = CreateCarFunc(new BMWFactory ());
??????????? Console.Write(car.Run() + "\n");
??????????? Console.Write(car.Stop() + "\n");
??????????? Console.Write(car.Accelerate() + "\n");
??????????? Console.Write(car.Decelerate() + "\n");
??????????? Console.Read();
??????? }
???????
public
static AbstractCar CreateCarFunc(AbstractFactory factory)
??????? {
???????????
return factory.CreateCar();
??????? }
}
在客戶端程序中,我們AbstractFactory的對象來得到Car的對象
結果如下:
BMW Run
BMW Stop
BMW Accelerate
BMW Decalerate
如果我們需求變了,現在要 BORA 的對象,那末,我們首先要對程序作一下擴展,先加入 BOAR 的 Car 類和 Factory 類,代碼如下:
public
class BORACar:AbstractCar
??? {
???????
public
override
string Run()
??????? {
???????????
return
"BORA Run";
??????? }
???????
public
override
string Stop()
??????? {
???????????
return
"BORA Stop";
??????? }
???????
public
override
string Accelerate()
??????? {
???????????
return
"BORA Accelerate";
??????? }
???????
public
override
string Decelerate()
??????? {
???????????
return
"BORA Decelerate";
??????? }
??? }
???
public
class BORAFactory:AbstractFactory
??? {
???????
public
override AbstractCar CreateCar()
??????? {
???????????
return
new BORACar();
??????? }
}
在客戶端程序中,我們只要稍作修改,將BMWFactory的實例化變為BORAFactory的實例化就可以,代碼如下:
class
Class1
??? {
???????
///
<summary>
???????
///
應用程序的主入口點。
???????
///
</summary>
??????? [STAThread]
???????
static
void
??????? {
??????????? AbstractCar car = CreateCarFunc(new BORAFactory());
??????????? Console.Write(car.Run() + "\n");
??????????? Console.Write(car.Stop() + "\n");
??????????? Console.Write(car.Accelerate() + "\n");
??????????? Console.Write(car.Decelerate() + "\n");
??????????? Console.Read();
??????? }
???????
public
static AbstractCar CreateCarFunc(AbstractFactory factory)
??????? {
???????????
return factory.CreateCar();
??????? }
}
得到的結果是:
BORA Run
BORA Stop
BORA Accelerate
BORA Decelerate
Factory Method 的幾個要點:
1 、 Factory Method 模式主要用于隔離類對象的使用者和具體類型之間的耦合關系。面對一個經常變化的具體類型,緊耦合關系會導致軟件的脆弱。
2 、 Factory Method 模式通過面向對象的手法,將所要創建的對象工作延遲到子類,從而實現一種擴展的策略,較好的解決了這種緊耦合關系。