石頭JAVA擺地攤兒

          JAVA所有的討論-要一點一點的進步

            BlogJava :: 首頁 ::  :: 聯系 ::  :: 管理 ::
            30 隨筆 :: 0 文章 :: 11 評論 :: 0 Trackbacks

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

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

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

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

          這樣A和B就是工廠,對應于抽象工廠;
          每個工廠生產的鼠標和鍵盤就是產品,對應于工廠方法;

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

          所以說抽象工廠就像工廠,而工廠方法則像是工廠的一種產品生產線
          ---------------------------------
          “抽象工廠”模式依賴于“工廠方法”模式的。因此,抽象工廠強調的是前面的動詞“抽象”,也就是說,你將工廠方法模式中的工廠方法抽象出來的那個"動作或設計"就是“抽象工程”模式了。
          ---------------------------------
          factory method針對的是一個產品等級結構  
          abstract factory是面向多個產品等級結構的
          ---------------------------------
          工廠方法模式:一個抽象產品類,可以派生出多個具體產品類。 
                                        一個抽象工廠類,可以派生出多個具體工廠類。 
                                        每個具體工廠類只能創建一個具體產品類的實例。 
          抽象工廠模式:多個抽象產品類,每個抽象產品類可以派生出多個具體產品類。 
                                        一個抽象工廠類,可以派生出多個具體工廠類。 
                                        每個具體工廠類可以創建多個具體產品類的實例。 
            
          區別:工廠方法模式只有一個抽象產品類,而抽象工廠模式有多個。
                工廠方法模式的具體工廠類只能創建一個具體產品類的實例,而抽象工廠模式可以創建多個。
          ---------------------------------
             1.如果一個后花園只種蔬菜類,那么就用簡單工廠就可以了.
             2.如果后花園蔬菜品種繁多.得用工廠方法才可以,把共有的東西抽象出來.
             3.如果要擴大后花園的規模,比如一個在北方,一個在南方,這樣工廠方法就無法實現了,就應當用抽象工廠,把各種各樣的植物,又組成一個后花園.
          所以我個人認為,簡單工廠是一個工廠只生產一類的產品,面對的是具體的類,工廠方法是可以生產不同的產品,把公共的方法抽象出來,然后進行創建各種各樣的產品.抽象工廠把幾種產品劃出共同的東西,把相互依賴的對象抽象出來,只要實現這些接口就可以得到不同的產品.
          具體例子:
          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(); 
               } 
          }

          心得:優點是只要實現共有的接口就可以實現不同車跑的方式.但缺點就是要判斷哪一種車,造成要修改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(); 
               } 
          }

          心得:優點是符合了開放-封閉原則(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(); 
               }

          }


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

          評論

          # re: 設計模式-快餐簡解-【抽象工廠模式-與-工廠方法模式區別】-網上抓文總結 2008-12-19 14:13 duduli
          好久沒更新了。。。。  回復  更多評論
            


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


          網站導航:
           
          主站蜘蛛池模板: 来安县| 万全县| 阜阳市| 治多县| 西平县| 蒙自县| 海门市| 慈利县| 乐山市| 福贡县| 常宁市| 光山县| 东丽区| 壤塘县| 莱州市| 安陆市| 留坝县| 霍邱县| 印江| 当涂县| 蓝田县| 平潭县| 营山县| 文水县| 中山市| 大埔区| 宁晋县| 徐州市| 蚌埠市| 新安县| 若羌县| 金秀| 望都县| 乌鲁木齐县| 浠水县| 崇义县| 枝江市| 乐业县| 德昌县| 黄石市| 敖汉旗|