爪哇一角

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

          抽象工廠UML圖:


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

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

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

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

          所以說(shuō)抽象工廠就像工廠,而工廠方法則像是工廠的一種產(chǎn)品生產(chǎn)線
          ---------------------------------
          “抽象工廠”模式依賴于“工廠方法”模式的。因此,抽象工廠強(qiáng)調(diào)的是前面的動(dòng)詞“抽象”,也就是說(shuō),你將工廠方法模式中的工廠方法抽象出來(lái)的那個(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.如果后花園蔬菜品種繁多.得用工廠方法才可以,把共有的東西抽象出來(lái).
             3.如果要擴(kuò)大后花園的規(guī)模,比如一個(gè)在北方,一個(gè)在南方,這樣工廠方法就無(wú)法實(shí)現(xiàn)了,就應(yīng)當(dāng)用抽象工廠,把各種各樣的植物,又組成一個(gè)后花園.
          所以我個(gè)人認(rèn)為,簡(jiǎn)單工廠是一個(gè)工廠只生產(chǎn)一類的產(chǎn)品,面對(duì)的是具體的類,工廠方法是可以生產(chǎn)不同的產(chǎn)品,把公共的方法抽象出來(lái),然后進(jìn)行創(chuàng)建各種各樣的產(chǎn)品.抽象工廠把幾種產(chǎn)品劃出共同的東西,把相互依賴的對(duì)象抽象出來(lái),只要實(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)是符合了開(kāi)放-封閉原則(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á)到了完美境界.把開(kāi)奔馳的司機(jī)和開(kāi)寶馬的司機(jī)的公共方法抽象出來(lái),并對(duì)不同的司機(jī)創(chuàng)建不同的類,到時(shí)候不管是開(kāi)什么車的司機(jī)隨你添加.它們唯一的共同點(diǎn)都是開(kāi)車.
          主站蜘蛛池模板: 眉山市| 亳州市| 西藏| 扎鲁特旗| 黔江区| 永定县| 仙桃市| 木兰县| 怀集县| 拉萨市| 海原县| 库伦旗| 泰顺县| 娱乐| 马边| 乐清市| 延庆县| 黄平县| 武隆县| 三台县| 辽阳市| 苗栗市| 黔江区| 射阳县| 城固县| 三亚市| 新巴尔虎右旗| 横峰县| 巴林右旗| 浦北县| 来安县| 遵义县| 黔南| 鸡东县| 富顺县| 海原县| 合肥市| 莱西市| 永川市| 怀集县| 澄迈县|