posts - 73,  comments - 55,  trackbacks - 0
          對(duì)于簡單工廠來說,它的工廠只能是這個(gè)樣子的
          public class SimplyFactory {
          /**
          * 靜態(tài)工廠方法
          */
          public static Prouct factory(String which) throw NoSuchProductExcption
          {

             if(which.equalIgnoreCase("product1"))
             {
             return new Product1();
              }
             else if(which.equalsIgnoreCase("product2"))
                {   
                  return new Product2(); 
                 }
            else if(which.equalsIgnoreCase("product3"))
                {   
                  return new Product3(); 
                 }
            else throw  NoSuchProductExcption("NoSuchProduct");
             }
            }
          }

          而對(duì)產(chǎn)品Product1,Product2,Product3,可以執(zhí)行接口Product,也可以不執(zhí)行接口Product(當(dāng)然這樣不好),這個(gè)Product接口只是用來抽象具體product用的

          public interface Product
          {
            void productMethod1();     //這些只是
            void productMethod2();
            void productMethod3();
          }
          對(duì)工廠來說,只要有這么一種產(chǎn)品,一般來說就要在工廠里有它的生產(chǎn)的方法, 否則拋出異常,而要工廠生產(chǎn)的話,也必須下達(dá)生產(chǎn)什么產(chǎn)品的命令,至少要向工廠發(fā)出信號(hào),讓工廠足以區(qū)分是要生產(chǎn)什么產(chǎn)品,否則工廠是不知道生產(chǎn)哪一種產(chǎn)品,
          對(duì)于簡單工廠來說,就是需要在工廠中枚舉所有的產(chǎn)品,所以說簡單工廠還是非常笨的。 


          if(which.equalIgnoreCase("product1"))     只是用來區(qū)分生產(chǎn)什么產(chǎn)品的標(biāo)記值,(也可以根據(jù)產(chǎn)品其它屬性來判斷,比如產(chǎn)品類型,產(chǎn)品大小,總之能夠區(qū)分是什么產(chǎn)品的屬性,或者是與產(chǎn)品屬性相關(guān)的變量)    或者說標(biāo)記值是A,生產(chǎn)A產(chǎn)品,或者工廠里定義不是這樣的,我偏偏要生產(chǎn)B產(chǎn)品,或者再特殊一些,我偏偏要生產(chǎn)A產(chǎn)品+B產(chǎn)品,那么就要return new ProductA()+new ProductB()了。

          這樣,我們就可以看出一個(gè)問題來,如果要能夠被簡單工廠生產(chǎn)出來,就必須在簡單工廠中有能夠生產(chǎn)出的它的方法定義,當(dāng)然還需要有這個(gè)具體產(chǎn)品類的定義,就是有class對(duì)應(yīng),這樣確保在簡單工廠中new 它的時(shí)候不會(huì)拋出 NoSuchProduct的Exception.


          對(duì)于工廠方法來說
          實(shí)質(zhì)上它是讓工廠實(shí)現(xiàn)了抽象的工廠接口,它把具體怎么生產(chǎn)一種東西,放在具體的工廠去實(shí)現(xiàn)了,所謂”延遲到子類中實(shí)現(xiàn)“
          public interface Creator
          {
            public Prouct factory();
          }

          public SubCreator1 implent Creator
          {
             public Prouct factory()
            {
             return new ConcreteProduct1();
             }
          }

          public SubCreator2 implent Creator
          {
             public Prouct factory()
            {
              return new ConcreteProduct2();
             }
          }
          請(qǐng)注意:返回類型是Product型的!!
          這樣客戶端調(diào)用是直接new 一個(gè)具體工廠的實(shí)例,然后命令它去生產(chǎn),而對(duì)于具體工廠的父類(既工廠接口,接口完全可以改成子類繼承父類來實(shí)現(xiàn),只是這樣不好,不符合OO的原則),它完全不知道什么產(chǎn)品被生產(chǎn)了,甚至它連那個(gè)具體工廠被實(shí)例化它都不知道

          抽象工廠模式 
          抽象工廠模式意圖是“提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口,而無需指定他們具體的類”或?yàn)樘囟ǖ目蛻簦ɑ蚯闆r)提供特定系列的對(duì)象。

          public interface Creator
          {
             public ProuctA factoryA();
             public ProuctB factoryB();
          }

          public interface ProductA     //ProductA 接口
          {
          }

          public interface ProductB     //ProductB 接口
          {
          }


          public class ConCreator1 implent Creator
          {
             public ProuctA factoryA()
            {
             return new ConcreteProductA1();
             }

             public ProuctB factoryB()
            {
             return new ConcreteProductB1();
             }
          }

          public class ConCreator2 implent Creator
          {
             public ProuctA factoryA()
             {
              return new ProductA2();
              }

             public ProuctB factoryB()
             {
             return new ProductB2();
              }
          }


          public class ProductA1 implements  ProductA
          {
           public  ProductA1()
             {
              }
          }
          public class ProductA2 implements  ProductA
          {
           public  ProductA2()
             {
              }
          }
          public class ProductB1 implements  ProductB
          {
           public  ProductB1()
             {
              }
          }
          public class ProductB2 implements  ProductB
          {
           public  ProductB2()
             {
              }
          }
          實(shí)際上是這樣的
          1,兩個(gè)工廠類ConCreator1,ConCreator2都實(shí)現(xiàn)了Creator接口
          2,ProuctA1,ProductA2都實(shí)現(xiàn)了ProductA接口
          3,ProuctB1,ProductB2都實(shí)現(xiàn)了ProductB接口
          4,ConCreator1負(fù)責(zé)生產(chǎn)ProductA類型的產(chǎn)品(包括ProductA1,ProductB1)
          5,ConCreator2負(fù)責(zé)生產(chǎn)ProductB類型的產(chǎn)品(包括ProductA2,ProductB2)
          6,工廠方法也有這樣的特征,也就是說Creator不知道什么被生產(chǎn)出來,甚至不知道ConCreator1還是ConCreator2被實(shí)例化了,因?yàn)閏lient高興調(diào)那一個(gè)工廠,就調(diào)那一個(gè)工廠,就是說工廠能生產(chǎn)什么,對(duì)客戶端是可見的。甚至還有一種情況,客戶端高興起來就生產(chǎn)了ProductA1,我就不生產(chǎn)ProductA2,因?yàn)樯厦娴睦又兴鼈冞€都是松散的,沒有綁定在一起




          于是提出另外一個(gè)例子,也是老提起的電腦類型的例子

          1,電腦生產(chǎn)商是接口,
          2,CUP是接口,
          3,硬盤是接口,
          4,IBM工廠是制造IBM品牌的電腦的工廠
          5,DELL工廠是制造DEll品牌的電腦的工廠
          為討論方便,就認(rèn)為電腦=CUP+硬盤;
          6,所以呀CUP有IBM的CPU和DELL的CPU
          7,同樣硬盤也是有IBM的硬盤和DELL的硬盤
          8,IBM工廠生產(chǎn)IBM的CPU和IBM的硬盤,絕對(duì)不生產(chǎn)DELL的CPU,也不生產(chǎn)DELL的硬盤
          9,同樣DELL工廠也是一樣


          public interface  電腦生產(chǎn)商
          {
             public CPU 制造CPU();
             public 硬盤 制造硬盤();
          }

          public interface CPU
          {
          }

          public interface 硬盤
          {
          }

          public class IBM的CPU implements CPU
          {
             public     IBM的CPU();
          }

          public class IBM的硬盤 implements 硬盤
          {
              public     IBM的硬盤();
          }

          public class DELL的CPU implements CPU
          {
              public     DELL的CPU();
          }

          public class DELL的硬盤 implements 硬盤
          {
             public     DELL的硬盤();
          }

          //下面是IBM工廠
          public class  IBM工廠
          {
             private CPU IBM的CPU私有變量=null;
             private 硬盤 IBM的硬盤私有變量=null;
             private CPU 制造IBMCPU()
            {
               return  new IBM的CPU();
             }
           private 硬盤 制造IBM硬盤()
           {
              return  new IBM的CPU();
            }
           public 電腦  制造IBM電腦()
           {
            try{
            IBM的CPU私有變量=制造IBMCPU();
            IBM的硬盤私有變量=制造IBM硬盤();
            if(IBM的CPU私有變量!=null&&IBM的硬盤私有變量!=null)
            retrun  (IBM的CPU私有變量+IBM的硬盤私有變量);
              //組裝成IBM電腦
             }
            catch(Exception e)
              {
              System.out.println("制造IBM電腦失敗!");
               }
             }
            }
          }

          這樣,客戶端無法通過命令單生產(chǎn)出一個(gè)CPU來,這樣抽象才真正成為一個(gè)完整產(chǎn)品的工廠,只要向工廠發(fā)出生產(chǎn)的命令,一臺(tái)完整的電腦就生產(chǎn)出來了,而工廠怎么生產(chǎn)的,生產(chǎn)了哪些部件,外界就看不見了,外界就知道這個(gè)工廠是生產(chǎn)IBM電腦整機(jī)的工廠!

          DELL電腦工廠一樣

          ----------------------------總結(jié)----------------------------

          工廠方法模式:
          一個(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è)。
          posted on 2006-07-18 11:20 保爾任 閱讀(1578) 評(píng)論(0)  編輯  收藏 所屬分類: Design Patten

          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿(4)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 乐平市| 泾阳县| 宜城市| 化州市| 康保县| 四川省| 崇礼县| 静安区| 南澳县| 曲靖市| 中西区| 镇安县| 昌宁县| 老河口市| 弥渡县| 潍坊市| 武宁县| 安平县| 翁牛特旗| 石泉县| 松阳县| 青神县| 抚宁县| 莱芜市| 凤冈县| 巩义市| 加查县| 北票市| 枣庄市| 巫山县| 榕江县| 阿克苏市| 和顺县| 桐柏县| 武穴市| 铅山县| 桓台县| 即墨市| 南开区| 板桥市| 商丘市|