Franky's LIFE

          Anything... ...

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            53 隨筆 :: 87 文章 :: 6 評論 :: 0 Trackbacks
          ? 剛開始接觸設計模式時就常常聽到同事提起工廠模式,那時也看過一些人寫的 Blog , 但是往往把注意力放在代碼的編寫上。在這段時間的學習中慢慢體會到設計模式是用來解決一類問題,而不是某些固定的代碼片段。換句話說是解決問題的思想。設 計模式可以解決模塊的耦合關系,可以解決因需求變動帶來的問題。程序在第一次編寫時,各個模塊之間可能是緊耦合,但是經過代碼重構,可以將模塊之間變為松 耦合。當然,我覺得我們也可以在軟件設計之初把變化考慮到其中,對于業務型軟件設計,在了解需求后,可以盡可能將其分出主次關系。也就是主體與枝節的關 系。如下圖


          ??????
          對 于工廠模式來說,要求高層模塊變化相對較慢,底層模塊變化相對較快。這樣符合設計模式中的依賴倒置原則——高層模塊不依賴于底層模塊。換句話說,軟件設計 是要劃分易變部分和穩定部分。這樣在一些枝節問題發生變化時,主干不用變化。如果是緊耦合狀態,有可能造成一個地方變化,連帶著很多地方要發生變化。

          ?????? 工廠模式要解決的是“某個對象”的創建工作,由于需求的變化,這個對象常常面臨著劇烈的變化,但是這個對象擁有的接口相對穩定。也就是說:枝節常常發生變化,但是枝節與主干的接口相對穩定。

          ?????? 《設計模式》中是這樣說明:定義一個用于創建對象的接口,讓子類決定實例化那個類。 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 Main(string[] args)

          ??????? {

          ??????????? 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 Main(string[] args)

          ??????? {

          ??????????? 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 模式通過面向對象的手法,將所要創建的對象工作延遲到子類,從而實現一種擴展的策略,較好的解決了這種緊耦合關系。

          posted on 2007-03-19 20:46 Franky 閱讀(107) 評論(0)  編輯  收藏 所屬分類: IT知識
          主站蜘蛛池模板: 阿坝| 宽甸| 崇信县| 泰州市| 诸城市| 潍坊市| 准格尔旗| 民勤县| 汤原县| 申扎县| 澳门| 五寨县| 巫溪县| 嘉义县| 鄂伦春自治旗| 东港市| 灵石县| 正蓝旗| 特克斯县| 山西省| 那曲县| 珠海市| 义乌市| 新乐市| 图木舒克市| 达尔| 获嘉县| 朝阳县| 靖西县| 濉溪县| 双柏县| 福建省| 南溪县| 宜兰县| 长泰县| 平顶山市| 民和| 原平市| 寻甸| 和静县| 日喀则市|