小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

設計模式學習筆記(五)——FactoryMethod工廠模式 - KiddLee - 博客園

 skywood 2007-08-06

       剛開始接觸設計模式時就常常聽到同事提起工廠模式,那時也看過一些人寫的Blog, 但是往往把注意力放在代碼的編寫上。在這段時間的學習中慢慢體會到設計模式是用來解決一類問題,而不是某些固定的代碼片段。換句話說是解決問題的思想。設 計模式可以解決模塊的耦合關系,可以解決因需求變動帶來的問題。程序在第一次編寫時,各個模塊之間可能是緊耦合,但是經(jīng)過代碼重構,可以將模塊之間變?yōu)樗? 耦合。當然,我覺得我們也可以在軟件設計之初把變化考慮到其中,對于業(yè)務型軟件設計,在了解需求后,可以盡可能將其分出主次關系。也就是主體與枝節(jié)的關 系。如下圖


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

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

       《設計模式》中是這樣說明:定義一個用于創(chuàng)建對象的接口,讓子類決定實例化那個類。FactoryMethod使得一個類的實例化延遲到子類。

       現(xiàn)在看這句話可能有些不明白,我們一會再來分析一下。先來看看工廠模式的大體結構。如下圖:


      
我們還是用實例化汽車的例子來解釋。對于客戶端程序(ClientApp)如果想要一個汽車的對象,需要調(diào)用生產(chǎn)這個汽車的Factory的對象。當然,這個類繼承自一個AbstractFactory基類。而這個Factory類就是《設計模式》中提到的“子類”,它來決定實例化那個類。

       下面我們來具體實現(xiàn)一下代碼,首先,我們需要兩個基類,一個是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的實現(xiàn)代碼:

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

如果我們需求變了,現(xiàn)在要BORA的對象,那末,我們首先要對程序作一下擴展,先加入BOARCar類和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的實例化變?yōu)?span lang="EN-US">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模式主要用于隔離類對象的使用者和具體類型之間的耦合關系。面對一個經(jīng)常變化的具體類型,緊耦合關系會導致軟件的脆弱。

2、Factory Method模式通過面向對象的手法,將所要創(chuàng)建的對象工作延遲到子類,從而實現(xiàn)一種擴展的策略,較好的解決了這種緊耦合關系。

posted on 2006-05-15 08:44 KiddLee 閱讀(1496) 評論(7)  編輯 收藏 引用 網(wǎng)摘 所屬分類: 設計模式

FeedBack:
# 
圖中抽象類的名稱應該用斜體吧?  回復  更多評論
  
# re: 設計模式學習筆記(五)——FactoryMethod工廠模式 2006-05-15 09:38 bisou.cn
一直弄不清楚 抽象工廠 和工廠模式 兩種設計模式,學習的時候教程上就說兩個容易混淆,可我還是混淆了。

我感覺 抽象工廠主要是針對類的
工廠模式 主要針對類里面的方法的!

在實際應用中大多都同時用到這兩種設計模式。比如微軟寫的那個操作數(shù)據(jù)庫的。

不知道這樣理解對不?

繼續(xù)關注中!  回復  更多評論
  
# re: 設計模式學習筆記(五)——FactoryMethod工廠模式 2006-05-15 12:56 Bruce Lee
抽象工廠是解決系列對象
工廠模式是解決單個對象  回復  更多評論
  
# re: 設計模式學習筆記(五)——FactoryMethod工廠模式 2006-05-15 12:56 kid_li
@bisou.cn
謝謝你的提醒,以后畫圖時,我會注意的。對于抽象工廠和工廠方法的區(qū)別我們可以從他們針對的問題來判斷:
抽象工廠模式:是解決“系列對象”的需求變化
工廠方法模式:是解決“單個對象”的需求變化  回復  更多評論
  
# re: 設計模式學習筆記(五)——FactoryMethod工廠模式 2006-05-16 10:01 bisou.cn
希望樓主繼續(xù)寫
更加平易近人的

支持并關注中  回復  更多評論
  
# re: 設計模式學習筆記(五)——FactoryMethod工廠模式 2006-05-16 10:56 共享精神
看是看懂了,但是不知道具體為SM要這樣寫,也許以后在項目中應用的時候.
就能明白其中的奧妙!
感謝樓主的好文章!  回復  更多評論
  
# re: 設計模式學習筆記(五)——FactoryMethod工廠模式 2006-09-29 16:10 showmi
好文章,但還沒看抽象工廠模式  回復  更多評論
  

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多