石頭JAVA擺地?cái)們?/a>

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

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

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

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

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

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

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

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

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

          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)點(diǎn)是只要實(shí)現(xiàn)共有的接口就可以實(shí)現(xiàn)不同車跑的方式.但缺點(diǎ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)點(diǎn)是符合了開放-封閉原則(OCP),從整體上還看不出什么缺點(diǎn).

          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ī)的公共方法抽象出來,并對(duì)不同的司機(jī)創(chuàng)建不同的類,到時(shí)候不管是開什么車的司機(jī)隨你添加.它們唯一的共同點(diǎn)都是開車.

          評(píng)論

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


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 集贤县| 赣州市| 错那县| 乐山市| 灵璧县| 阿勒泰市| 辉南县| 金湖县| 锡林浩特市| 大冶市| 七台河市| 安溪县| 麻城市| 永新县| 饶河县| 静海县| 虞城县| 嵊泗县| 乌海市| 吴堡县| 蒙城县| 乌鲁木齐县| 香港| 法库县| 若羌县| 乌审旗| 安阳市| 贡嘎县| 顺义区| 平阳县| 郧西县| 开阳县| 綦江县| 临潭县| 镇坪县| 吴旗县| 嘉鱼县| 平阴县| 枣强县| 托克逊县| 松滋市|