Pragmatic Coder

          best practices
          posts - 8, comments - 0, trackbacks - 0, articles - 0

          〔本站副站發(fā)布,主站:designpatterns.cnblogs.com〕

          ○。背景與背景知識

          這是昨天在QQ上舉的一個例子。本文并不是從頭講Factory Method模式,僅對其實現(xiàn)細節(jié)進行討論。關(guān)于這個模式可以參考wayfarer呂震宇的文章。

          一。分析

          因為Factory Method(大寫的Factory Method表示模式名稱)模式的一個目的就是使得創(chuàng)建行為(factory method)(小寫的factory method表示創(chuàng)建行為方法)抽象化,由子類實現(xiàn),從而容易擴展。一個純的Factory Method模式,其factory method是不能用static來實現(xiàn)的。通常Simple Factory模式才會由static來實現(xiàn)。

          但是,一個Factory擁有一個static的創(chuàng)建方法是很誘人的。用戶在任何時候只要用類名(Factory的類名)既可以創(chuàng)建出需要的Product。wayfarer?的文章最后給出的DotNet的實現(xiàn)部分就是這樣的例子。呂震宇的另一篇文章?(關(guān)于Simple Factory模式)的回復中Walkdan給出的解決方案也是這樣的。從本質(zhì)上,這兩個例子都不是純的Factory Method模式或者Simple Factory模式,而是Simple Factory模式和Factory Method模式的組合應(yīng)用。

          引用Walkdan的回復:

          Simple Factory最大的好處是把變化集中到了一處。另外,LightSimpleFactory.Create()里面的依賴關(guān)系也可以消除,我的做法是:

          1. 聲明構(gòu)造子

          public interface?ILightCreator
          {
          ????Light?Create();
          }

          public class?BulbLightCreator:?ILightCreator
          {
          public?Light?Create()
          ????{
          return new?BulbLight();
          ????}
          }
          .

          2. 注冊構(gòu)造子

          creators.Register("Bulb",?new?BulbLightCreator());
          creators.Register("Tube",?new?TubeLightCreator());
          .

          3.?Simple Factory中創(chuàng)建對象?

          public class?LightSimpleFactory.Create(string?lightType)
          {
          ????ILightCreator?creator?=?creators.Find(lightType);
          return?creator.Create();
          }

          構(gòu)造子其實就是Factory Method。這樣, 通過注冊構(gòu)造子,3.中原來的switch()過程被消除,依賴關(guān)系隨之解除。其中的Register(), Find()容易理解,方法就不寫了。

          新的類型可通過新注冊構(gòu)造子來實現(xiàn)擴展。當然2中的注冊代碼僅僅是示例,完全可以放到配置文件中去實現(xiàn),比如:

          <lightCreators>
          <add?name="Bulb"?type="BulbLightCreator,"/>
          <add?name="Tube"?type="TubeLightCreator,"/>
          </lightCreators>

          其ILightCreator繼承體系,是Factory Method模式。LightSimpleFactory和creators的關(guān)系Walkdan沒有說明,也可實現(xiàn)為Strategy模式。

          二。引申問題

          1. 模式中factory method一定要是抽象的嗎? NO.你可以定義一個默認的方法,生產(chǎn)某種Product。這樣即使Factory沒有子類也可以生產(chǎn)這種默認產(chǎn)品。通常這種情況下Factory是一個接口,然后定義一個BasicFactory來生產(chǎn)BasicProduct。其他的Factory由BasicFactory派生。注意,往往Factory和Product是平行的繼承結(jié)構(gòu)。
          2. Factory Method解耦了client和concreteProduct,是不是又引入了client和concreteFactory的耦合? 這個問題很好,答案是可能(《head first design patterns》一書中的例子就有這個問題),但是client端不應(yīng)該依賴concreteFactory。如果依賴concreteFactory,那真是畫蛇添足了(見wayfarer的文章)。
          3. Factory Method模式的好處有哪些?
            1. 封裝了對象的創(chuàng)建。對象的創(chuàng)建如果使用new來完成,則與實現(xiàn)類(concreteProduct)是緊耦合的。Factory Method的創(chuàng)建行為factory method,返回Product接口,從而解耦了client和concreteProduct。
            2. 易于擴展。相對于Simple Factory模式,F(xiàn)actory Method模式可以通過派生進行擴展。

          三。結(jié)論

          一個純的Factory Method模式其factory method不可以用static實現(xiàn),通過與其他模式結(jié)合使用可以進行變通。而且通常情況下Factory Method模式都會與其他模式相結(jié)合。Abstract Factory模式通常就是用Factory Method模式來實現(xiàn)。


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 武平县| 通山县| 乐都县| 无棣县| 平遥县| 五家渠市| 油尖旺区| 杨浦区| 瑞安市| 灵山县| 江津市| 伊吾县| 辽阳市| 五台县| 河津市| 竹北市| 察哈| 宜兰县| 遵义市| 茌平县| 乾安县| 怀来县| 平泉县| 津市市| 突泉县| 抚宁县| 乡城县| 农安县| 武山县| 绥滨县| 丹寨县| 涞水县| 卢氏县| 桃园市| 涿州市| 徐汇区| 泗洪县| 靖西县| 班戈县| 屏边| 巴青县|