爪哇一角

          共同探討STRUTS#HIBERNATE#SPRING#EJB等技術(shù)
          posts - 3, comments - 6, trackbacks - 0, articles - 99
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          日歷

          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          隨筆檔案

          搜索

          •  

          最新評論

          抽象工廠模式-與-工廠方法模式區(qū)別

          Posted on 2009-01-20 17:34 非洲小白臉 閱讀(257) 評論(0)  編輯  收藏 所屬分類: 模式
          工廠方法UML圖:

          抽象工廠UML圖:


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

          比如說工廠可以生產(chǎn)鼠標(biāo)和鍵盤。那么抽象工廠的實(shí)現(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è)計(jì)"就是“抽象工程”模式了。
          ---------------------------------
          factory method針對的是一個產(chǎn)品等級結(jié)構(gòu)  
          abstract factory是面向多個產(chǎn)品等級結(jié)構(gòu)的
          ---------------------------------
          工廠方法模式:一個抽象產(chǎn)品類,可以派生出多個具體產(chǎn)品類。 
                                        一個抽象工廠類,可以派生出多個具體工廠類。 
                                        每個具體工廠類只能創(chuàng)建一個具體產(chǎn)品類的實(shí)例。 
          抽象工廠模式:多個抽象產(chǎn)品類,每個抽象產(chǎn)品類可以派生出多個具體產(chǎn)品類。 
                                        一個抽象工廠類,可以派生出多個具體工廠類。 
                                        每個具體工廠類可以創(chuàng)建多個具體產(chǎn)品類的實(shí)例。 
            
          區(qū)別:工廠方法模式只有一個抽象產(chǎn)品類,而抽象工廠模式有多個。
                工廠方法模式的具體工廠類只能創(chuàng)建一個具體產(chǎn)品類的實(shí)例,而抽象工廠模式可以創(chuàng)建多個。
          ---------------------------------
             1.如果一個后花園只種蔬菜類,那么就用簡單工廠就可以了.
             2.如果后花園蔬菜品種繁多.得用工廠方法才可以,把共有的東西抽象出來.
             3.如果要擴(kuò)大后花園的規(guī)模,比如一個在北方,一個在南方,這樣工廠方法就無法實(shí)現(xiàn)了,就應(yīng)當(dāng)用抽象工廠,把各種各樣的植物,又組成一個后花園.
          所以我個人認(rèn)為,簡單工廠是一個工廠只生產(chǎn)一類的產(chǎn)品,面對的是具體的類,工廠方法是可以生產(chǎn)不同的產(chǎn)品,把公共的方法抽象出來,然后進(jìn)行創(chuàng)建各種各樣的產(chǎn)品.抽象工廠把幾種產(chǎn)品劃出共同的東西,把相互依賴的對象抽象出來,只要實(shí)現(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)點(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ī)的公共方法抽象出來,并對不同的司機(jī)創(chuàng)建不同的類,到時候不管是開什么車的司機(jī)隨你添加.它們唯一的共同點(diǎn)都是開車.
          主站蜘蛛池模板: 咸阳市| 红原县| 阳朔县| 武川县| 沙湾县| 梓潼县| 苏尼特右旗| 高雄县| 芜湖市| 乌兰县| 阿拉善左旗| 兴文县| 永吉县| 启东市| 抚顺县| 营口市| 成安县| 开远市| 阳东县| 闽清县| 新巴尔虎左旗| 乾安县| 中宁县| 鹤山市| 泗洪县| 武安市| 雷波县| 巴林右旗| 泾阳县| 临邑县| 图片| 通城县| 桓仁| 桑植县| 松原市| 合肥市| 兴安县| 易门县| 堆龙德庆县| 庆安县| 当涂县|