<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 73,  comments - 55,  trackbacks - 0
    對(duì)于簡(jiǎn)單工廠來(lái)說(shuō),它的工廠只能是這個(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接口只是用來(lái)抽象具體product用的

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


    if(which.equalIgnoreCase("product1"))     只是用來(lái)區(qū)分生產(chǎn)什么產(chǎn)品的標(biāo)記值,(也可以根據(jù)產(chǎn)品其它屬性來(lái)判斷,比如產(chǎn)品類(lèi)型,產(chǎn)品大小,總之能夠區(qū)分是什么產(chǎn)品的屬性,或者是與產(chǎn)品屬性相關(guān)的變量)    或者說(shuō)標(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è)問(wèn)題來(lái),如果要能夠被簡(jiǎn)單工廠生產(chǎn)出來(lái),就必須在簡(jiǎn)單工廠中有能夠生產(chǎn)出的它的方法定義,當(dāng)然還需要有這個(gè)具體產(chǎn)品類(lèi)的定義,就是有class對(duì)應(yīng),這樣確保在簡(jiǎn)單工廠中new 它的時(shí)候不會(huì)拋出 NoSuchProduct的Exception.


    對(duì)于工廠方法來(lái)說(shuō)
    實(shí)質(zhì)上它是讓工廠實(shí)現(xiàn)了抽象的工廠接口,它把具體怎么生產(chǎn)一種東西,放在具體的工廠去實(shí)現(xiàn)了,所謂”延遲到子類(lèi)中實(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)注意:返回類(lèi)型是Product型的!!
    這樣客戶端調(diào)用是直接new 一個(gè)具體工廠的實(shí)例,然后命令它去生產(chǎn),而對(duì)于具體工廠的父類(lèi)(既工廠接口,接口完全可以改成子類(lèi)繼承父類(lèi)來(lái)實(shí)現(xiàn),只是這樣不好,不符合OO的原則),它完全不知道什么產(chǎn)品被生產(chǎn)了,甚至它連那個(gè)具體工廠被實(shí)例化它都不知道

    抽象工廠模式 
    抽象工廠模式意圖是“提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴(lài)對(duì)象的接口,而無(wú)需指定他們具體的類(lèi)”或?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è)工廠類(lèi)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類(lèi)型的產(chǎn)品(包括ProductA1,ProductB1)
    5,ConCreator2負(fù)責(zé)生產(chǎn)ProductB類(lèi)型的產(chǎn)品(包括ProductA2,ProductB2)
    6,工廠方法也有這樣的特征,也就是說(shuō)Creator不知道什么被生產(chǎn)出來(lái),甚至不知道ConCreator1還是ConCreator2被實(shí)例化了,因?yàn)閏lient高興調(diào)那一個(gè)工廠,就調(diào)那一個(gè)工廠,就是說(shuō)工廠能生產(chǎn)什么,對(duì)客戶端是可見(jiàn)的。甚至還有一種情況,客戶端高興起來(lái)就生產(chǎn)了ProductA1,我就不生產(chǎn)ProductA2,因?yàn)樯厦娴睦又兴鼈冞€都是松散的,沒(méi)有綁定在一起




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

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


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

    public interface CPU
    {
    }

    public interface 硬盤(pán)
    {
    }

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

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

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

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

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

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

    DELL電腦工廠一樣

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

    工廠方法模式:
    一個(gè)抽象產(chǎn)品類(lèi),可以派生出多個(gè)具體產(chǎn)品類(lèi)。  
    一個(gè)抽象工廠類(lèi),可以派生出多個(gè)具體工廠類(lèi)。  
    每個(gè)具體工廠類(lèi)只能創(chuàng)建一個(gè)具體產(chǎn)品類(lèi)的實(shí)例。

    抽象工廠模式:
    多個(gè)抽象產(chǎn)品類(lèi),每個(gè)抽象產(chǎn)品類(lèi)可以派生出多個(gè)具體產(chǎn)品類(lèi)。  
    一個(gè)抽象工廠類(lèi),可以派生出多個(gè)具體工廠類(lèi)。  
    每個(gè)具體工廠類(lèi)可以創(chuàng)建多個(gè)具體產(chǎn)品類(lèi)的實(shí)例。  
       
    區(qū)別:
    工廠方法模式只有一個(gè)抽象產(chǎn)品類(lèi),而抽象工廠模式有多個(gè)。  
    工廠方法模式的具體工廠類(lèi)只能創(chuàng)建一個(gè)具體產(chǎn)品類(lèi)的實(shí)例,而抽象工廠模式可以創(chuàng)建多個(gè)。
    posted on 2006-07-18 11:20 保爾任 閱讀(1576) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Design Patten

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

    常用鏈接

    留言簿(4)

    隨筆分類(lèi)

    隨筆檔案

    文章分類(lèi)

    文章檔案

    搜索

    •  

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 精品福利一区二区三区免费视频| 羞羞视频网站免费入口| 四虎成年永久免费网站| 亚洲精品国产摄像头| 国产美女无遮挡免费视频| 成人午夜免费视频| 亚洲色图综合网站| 国产99视频精品免费视频7| 免费无码又爽又刺激网站直播| 亚洲AV无码国产在丝袜线观看| 精品久久8x国产免费观看| 激情小说亚洲图片| 亚洲理论片在线中文字幕| 免费看小12萝裸体视频国产| 中文字幕在线视频免费| 亚洲熟伦熟女专区hd高清| 亚洲日产无码中文字幕| 夜夜爽免费888视频| 欧洲人免费视频网站在线| 风间由美在线亚洲一区| 亚洲酒色1314狠狠做| 在线观看亚洲成人| 可以免费观看一级毛片黄a| 国产一卡二卡四卡免费| 国产成人无码精品久久久久免费| 国产成人亚洲合集青青草原精品| 亚洲欧洲日产国码无码网站| 国产视频精品免费| 99久久免费国产精品特黄| 日韩中文字幕免费视频| 国产精品美女久久久免费| 国产精品亚洲а∨无码播放麻豆| 亚洲国产视频一区| 亚洲网站在线免费观看| 亚洲国产精品一区二区久久hs| 亚洲熟妇少妇任你躁在线观看无码| 免费无码A片一区二三区| 69av免费视频| 扒开双腿猛进入爽爽免费视频| 日韩免费高清大片在线| 免费播放一区二区三区|