石頭JAVA擺地攤兒

          JAVA所有的討論-要一點一點的進(jìn)步

            BlogJava :: 首頁 ::  :: 聯(lián)系 ::  :: 管理 ::
            30 隨筆 :: 0 文章 :: 11 評論 :: 0 Trackbacks

            最近網(wǎng)友一直在討論這個問題,搜索引擎過后網(wǎng)上抓文總結(jié)如下:

            工廠方法UML圖:
            
            抽象工廠UML圖:
            

          ---------------------------------
          對于java來說,你能見到的大部分抽象工廠模式都是這樣的:
          它的里面是一堆工廠方法,每個工廠方法返回某種類型的對象。

          比如說工廠可以生產(chǎn)鼠標(biāo)和鍵盤。那么抽象工廠的實現(xiàn)類(它的某個具體子類)的對象都可以生產(chǎn)鼠標(biāo)和鍵盤,但可能工廠A生產(chǎn)的是羅技的鍵盤和鼠標(biāo),工廠B是微軟的。

          這樣A和B就是工廠,對應(yīng)于抽象工廠;
          每個工廠生產(chǎn)的鼠標(biāo)和鍵盤就是產(chǎn)品,對應(yīng)于工廠方法;

          用了工廠方法模式,你替換生成鍵盤的工廠方法,就可以把鍵盤從羅技換到微軟。但是用了抽象工廠模式,你只要換家工廠,就可以同時替換鼠標(biāo)和鍵盤一套。如果你要的產(chǎn)品有幾十個,當(dāng)然用抽象工廠模式一次替換全部最方便(這個工廠會替你用相應(yīng)的工廠方法)

          所以說抽象工廠就像工廠,而工廠方法則像是工廠的一種產(chǎn)品生產(chǎn)線
          ---------------------------------
          “抽象工廠”模式依賴于“工廠方法”模式的。因此,抽象工廠強(qiáng)調(diào)的是前面的動詞“抽象”,也就是說,你將工廠方法模式中的工廠方法抽象出來的那個"動作或設(shè)計"就是“抽象工程”模式了。
          ---------------------------------
          factory method針對的是一個產(chǎn)品等級結(jié)構(gòu)  
          abstract factory是面向多個產(chǎn)品等級結(jié)構(gòu)的
          ---------------------------------
          工廠方法模式:一個抽象產(chǎn)品類,可以派生出多個具體產(chǎn)品類。 
                                        一個抽象工廠類,可以派生出多個具體工廠類。 
                                        每個具體工廠類只能創(chuàng)建一個具體產(chǎn)品類的實例。 
          抽象工廠模式:多個抽象產(chǎn)品類,每個抽象產(chǎn)品類可以派生出多個具體產(chǎn)品類。 
                                        一個抽象工廠類,可以派生出多個具體工廠類。 
                                        每個具體工廠類可以創(chuàng)建多個具體產(chǎn)品類的實例。 
            
          區(qū)別:工廠方法模式只有一個抽象產(chǎn)品類,而抽象工廠模式有多個。
                工廠方法模式的具體工廠類只能創(chuàng)建一個具體產(chǎn)品類的實例,而抽象工廠模式可以創(chuàng)建多個。
          ---------------------------------
             1.如果一個后花園只種蔬菜類,那么就用簡單工廠就可以了.
             2.如果后花園蔬菜品種繁多.得用工廠方法才可以,把共有的東西抽象出來.
             3.如果要擴(kuò)大后花園的規(guī)模,比如一個在北方,一個在南方,這樣工廠方法就無法實現(xiàn)了,就應(yīng)當(dāng)用抽象工廠,把各種各樣的植物,又組成一個后花園.
          所以我個人認(rèn)為,簡單工廠是一個工廠只生產(chǎn)一類的產(chǎn)品,面對的是具體的類,工廠方法是可以生產(chǎn)不同的產(chǎn)品,把公共的方法抽象出來,然后進(jìn)行創(chuàng)建各種各樣的產(chǎn)品.抽象工廠把幾種產(chǎn)品劃出共同的東西,把相互依賴的對象抽象出來,只要實現(xiàn)這些接口就可以得到不同的產(chǎn)品.
          具體例子:
          1.簡單工廠:

          using System; 
          public interface ICar 

               
          void run(); 


          public class BMWCar : ICar 

               
          public void run() 
               { 
                   Console.WriteLine(
          "BMWCar run"); 
               } 


          public class BenzCar : ICar 

               
          public void run() 
               { 
                   Console.WriteLine(
          "BenzCar run"); 
               } 


          public class Driver 

               
          public static ICar DriverCar(string carType) 
               { 
                   
          switch (carType) 
                   { 
                       
          case "BMWCar"return new BMWCar(); 
                       
          case "BenzCar"return new BenzCar(); 
                       
          defaultthrow new Exception(); 
                  } 
               } 


          public class Client 

               
          public static void Main() 
               { 
                   ICar myCar 
          = Driver.DriverCar("BenzCar"); 
                   myCar.run(); 
                   Console.Read(); 
               } 
          }

          心得:優(yōu)點是只要實現(xiàn)共有的接口就可以實現(xiàn)不同車跑的方式.但缺點就是要判斷哪一種車,造成要修改Driver 類
          2.工廠方法:
          using System; 
          public interface ICar 

               
          void run(); 


          public class BMWCar : ICar 

               
          public void run() 
               { 
                   Console.WriteLine(
          "BMWCar run"); 
               } 


          public class BenzCar : ICar 

               
          public void run() 
               { 
                   Console.WriteLine(
          "BenzCar run"); 
               } 

          public abstract class Driver 

               
          public abstract ICar DriverCar(); 


          public class BMWDriver : Driver 

               
          public override ICar   DriverCar() 
               { 
                   
          return new BMWCar(); 
               } 


          public class BenzDriver : Driver 

               
          public   override ICar DriverCar() 
               { 
                   
          return new BenzCar(); 
               } 


          class Client 

               
          public static void Main() 
               { 
                   Driver myDriver 
          = new BenzDriver(); 
                   ICar myCar 
          = myDriver.DriverCar(); 
                   myCar.run(); 
                   Console.Read(); 
               } 
          }

          心得:優(yōu)點是符合了開放-封閉原則(OCP),從整體上還看不出什么缺點.

          3.抽象工廠:

          using System; 

          public interface IBusinessCar 

               
          void run(); 


          public interface ISportCar 

          void run(); 


          public class BMWBusinessCar : IBusinessCar 

               
          public void run() 
               { 
                   Console.WriteLine(
          "BMWCar run"); 
               }

          }

          public class BenzBusinessCar : IBusinessCar 

               
          public void run() 
               { 
                   Console.WriteLine(
          "BenzBusinessCar run"); 
               } 


          public class BMWSportCar:ISportCar 

          public void run() 

          Console.WriteLine(
          "BMWSportCar run"); 



          public class BenzSportCar:ISportCar 

          public void run() 
          {

          Console.WriteLine(
          "BenzSportCar run"); 



          public interface IDriver 

          IBusinessCar BusinessCarDriver(); 
          ISportCar SportCarDriver(); 


          public class BMWDriver:IDriver 

          public IBusinessCar BusinessCarDriver() 

          return new BMWBusinessCar(); 

          public ISportCar SportCarDriver() 

          return new BMWSportCar(); 



          public class BenzDriver:IDriver 

          public IBusinessCar BusinessCarDriver() 

          return new BenzBusinessCar(); 


          public ISportCar SportCarDriver() 

          return new BenzSportCar(); 

          }


          class Client 

               
          public static void Main() 
               { 
                   IDriver myDriver 
          =new BenzDriver(); 
                   ISportCar myCar 
          = myDriver.SportCarDriver(); 
                   myCar.run(); 
                   Console.Read(); 
               }

          }


          心得:抽象方法似乎達(dá)到了完美境界.把開奔馳的司機(jī)和開寶馬的司機(jī)的公共方法抽象出來,并對不同的司機(jī)創(chuàng)建不同的類,到時候不管是開什么車的司機(jī)隨你添加.它們唯一的共同點都是開車.
          posted on 2008-11-25 14:06 石頭JAVA擺地攤兒 閱讀(1121) 評論(1)  編輯  收藏

          評論

          # re: 設(shè)計模式-快餐簡解-【抽象工廠模式-與-工廠方法模式區(qū)別】-網(wǎng)上抓文總結(jié) 2008-12-19 14:13 duduli
          好久沒更新了。。。。  回復(fù)  更多評論
            


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 西吉县| 洪泽县| 辽源市| 达州市| 盐亭县| 宝山区| 台南县| 东丰县| 山东省| 六枝特区| 垦利县| 古丈县| 长寿区| 专栏| 上栗县| 松阳县| 达拉特旗| 宿迁市| 克山县| 开原市| 伊金霍洛旗| 麻江县| 兴义市| 商丘市| 阿巴嘎旗| 道真| 河源市| 咸丰县| 东港市| 宁津县| 岳阳县| 霸州市| 长宁区| 保靖县| 旬阳县| 霞浦县| 班玛县| 彩票| 江源县| 阿拉善盟| 惠东县|