www.e4938.cn-老师你下面太紧了拔不出来,99re8这里有精品热视频免费,国产第一视频一区二区三区,青青草国产成人久久

<button id="60qo0"></button>

<strike id="60qo0"></strike>
<del id="60qo0"></del>
<fieldset id="60qo0"><menu id="60qo0"></menu></fieldset>
  • JAVA設(shè)計(jì)模式之工廠模式(簡(jiǎn)單工廠模式+工廠方法模式)

    2018-03-14 14:57:21 csdn  點(diǎn)擊量: 評(píng)論 (0)
    在面向?qū)ο缶幊讨? 最通常的方法是一個(gè)new操作符產(chǎn)生一個(gè)對(duì)象實(shí)例,new操作符就是用來(lái)構(gòu)造對(duì)象實(shí)例的。但是在一些情況下, new操作符直接生

     在面向?qū)ο缶幊讨? 最通常的方法是一個(gè)new操作符產(chǎn)生一個(gè)對(duì)象實(shí)例,new操作符就是用來(lái)構(gòu)造對(duì)象實(shí)例的。但是在一些情況下, new操作符直接生成對(duì)象會(huì)帶來(lái)一些問(wèn)題。舉例來(lái)說(shuō), 許多類(lèi)型對(duì)象的創(chuàng)造需要一系列的步驟: 你可能需要計(jì)算或取得對(duì)象的初始設(shè)置; 選擇生成哪個(gè)子對(duì)象實(shí)例; 或在生成你需要的對(duì)象之前必須先生成一些輔助功能的對(duì)象。 在這些情況,新對(duì)象的建立就是一個(gè) “過(guò)程”,不僅是一個(gè)操作,像一部大機(jī)器中的一個(gè)齒輪傳動(dòng)。

     

    模式的問(wèn)題:你如何能輕松方便地構(gòu)造對(duì)象實(shí)例,而不必關(guān)心構(gòu)造對(duì)象實(shí)例的細(xì)節(jié)和復(fù)雜過(guò)程呢?

    解決方案:建立一個(gè)工廠來(lái)創(chuàng)建對(duì)象

    實(shí)現(xiàn):

    一、引言
        1)還沒(méi)有工廠時(shí)代:假如還沒(méi)有工業(yè)革命,如果一個(gè)客戶要一款寶馬車(chē),一般的做法是客戶去創(chuàng)建一款寶馬車(chē),然后拿來(lái)用。
        2)簡(jiǎn)單工廠模式:后來(lái)出現(xiàn)工業(yè)革命。用戶不用去創(chuàng)建寶馬車(chē)。因?yàn)榭蛻粲幸粋€(gè)工廠來(lái)幫他創(chuàng)建寶馬.想要什么車(chē),這個(gè)工廠就可以建。比如想要320i系列車(chē)。工廠就創(chuàng)建這個(gè)系列的車(chē)。即工廠可以創(chuàng)建產(chǎn)品。
        3)工廠方法模式時(shí)代:為了滿足客戶,寶馬車(chē)系列越來(lái)越多,如320i,523i,30li等系列一個(gè)工廠無(wú)法創(chuàng)建所有的寶馬系列。于是由單獨(dú)分出來(lái)多個(gè)具體的工廠。每個(gè)具體工廠創(chuàng)建一種系列。即具體工廠類(lèi)只能創(chuàng)建一個(gè)具體產(chǎn)品。但是寶馬工廠還是個(gè)抽象。你需要指定某個(gè)具體的工廠才能生產(chǎn)車(chē)出來(lái)。

       4)抽象工廠模式時(shí)代:隨著客戶的要求越來(lái)越高,寶馬車(chē)必須配置空調(diào)。于是這個(gè)工廠開(kāi)始生產(chǎn)寶馬車(chē)和需要的空調(diào)。

       最終是客戶只要對(duì)寶馬的銷(xiāo)售員說(shuō):我要523i空調(diào)車(chē),銷(xiāo)售員就直接給他523i空調(diào)車(chē)了。而不用自己去創(chuàng)建523i空調(diào)車(chē)寶馬車(chē).

       這就是工廠模式。

    二、分類(lèi) 
            工廠模式主要是為創(chuàng)建對(duì)象提供過(guò)渡接口,以便將創(chuàng)建對(duì)象的具體過(guò)程屏蔽隔離起來(lái),達(dá)到提高靈活性的目的。 
    工廠模式可以分為三類(lèi): 

    1)簡(jiǎn)單工廠模式(Simple Factory) 
    2)工廠方法模式(Factory Method) 
    3)抽象工廠模式(Abstract Factory) 

     這三種模式從上到下逐步抽象,并且更具一般性。 
            GOF在《設(shè)計(jì)模式》一書(shū)中將工廠模式分為兩類(lèi):工廠方法模式(Factory Method)與抽象工廠模式(Abstract Factory)。

            將簡(jiǎn)單工廠模式(Simple Factory)看為工廠方法模式的一種特例,兩者歸為一類(lèi)。 

    三、區(qū)別 
    工廠方法模式:
    一個(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è)。

    兩者皆可。 

     四、簡(jiǎn)單工廠模式 
    建立一個(gè)工廠(一個(gè)函數(shù)或一個(gè)類(lèi)方法)來(lái)制造新的對(duì)象。
    分布說(shuō)明引子:從無(wú)到有。客戶自己創(chuàng)建寶馬車(chē),然后拿來(lái)用。

     

     

    [java] view plain copy
     
    1. public class BMW320 {  
    2.     public BMW320(){  
    3.         System.out.println("制造-->BMW320");  
    4.     }  
    5. }  
    6.   
    7. public class BMW523 {  
    8.     public BMW523(){  
    9.         System.out.println("制造-->BMW523");  
    10.     }  
    11. }  
    12.   
    13. public class Customer {  
    14.     public static void main(String[] args) {  
    15.         BMW320 bmw320 = new BMW320();  
    16.         BMW523 bmw523 = new BMW523();  
    17.     }  
    18. }  

    客戶需要知道怎么去創(chuàng)建一款車(chē),客戶和車(chē)就緊密耦合在一起了.為了降低耦合,就出現(xiàn)了工廠類(lèi),把創(chuàng)建寶馬的操作細(xì)節(jié)都放到了工廠里面去,客戶直接使用工廠的創(chuàng)建工廠方法,傳入想要的寶馬車(chē)型號(hào)就行了,而不必去知道創(chuàng)建的細(xì)節(jié).這就是工業(yè)革命了:簡(jiǎn)單工廠模式

    即我們建立一個(gè)工廠類(lèi)方法來(lái)制造新的對(duì)象。如圖:

    產(chǎn)品類(lèi):

    [java] view plain copy
     
    1. abstract class BMW {  
    2.     public BMW(){  
    3.           
    4.     }  
    5. }  
    6.   
    7. public class BMW320 extends BMW {  
    8.     public BMW320() {  
    9.         System.out.println("制造-->BMW320");  
    10.     }  
    11. }  
    12. public class BMW523 extends BMW{  
    13.     public BMW523(){  
    14.         System.out.println("制造-->BMW523");  
    15.     }  
    16. }  

    工廠類(lèi):

    [java] view plain copy
     
    1. public class Factory {  
    2.     public BMW createBMW(int type) {  
    3.         switch (type) {  
    4.           
    5.         case 320:  
    6.             return new BMW320();  
    7.   
    8.         case 523:  
    9.             return new BMW523();  
    10.   
    11.         default:  
    12.             break;  
    13.         }  
    14.         return null;  
    15.     }  
    16. }  


    客戶類(lèi):

    [java] view plain copy
     
    1. public class Customer {  
    2.     public static void main(String[] args) {  
    3.         Factory factory = new Factory();  
    4.         BMW bmw320 = factory.createBMW(320);  
    5.         BMW bmw523 = factory.createBMW(523);  
    6.     }  
    7. }  

       簡(jiǎn)單工廠模式又稱(chēng)靜態(tài)工廠方法模式。重命名上就可以看出這個(gè)模式一定很簡(jiǎn)單。它存在的目的很簡(jiǎn)單:定義一個(gè)用于創(chuàng)建對(duì)象的接口。 
          先來(lái)看看它的組成: 
             1) 工廠類(lèi)角色:這是本模式的核心,含有一定的商業(yè)邏輯和判斷邏輯,用來(lái)創(chuàng)建產(chǎn)品
             2) 抽象產(chǎn)品角色:它一般是具體產(chǎn)品繼承的父類(lèi)或者實(shí)現(xiàn)的接口。         
             3) 具體產(chǎn)品角色:工廠類(lèi)所創(chuàng)建的對(duì)象就是此角色的實(shí)例。在java中由一個(gè)具體類(lèi)實(shí)現(xiàn)。 
            
            下面我們從開(kāi)閉原則(對(duì)擴(kuò)展開(kāi)放;對(duì)修改封閉)上來(lái)分析下簡(jiǎn)單工廠模式。當(dāng)客戶不再滿足現(xiàn)有的車(chē)型號(hào)的時(shí)候,想要一種速度快的新型車(chē),只要這種車(chē)符合抽象產(chǎn)品制定的合同,那么只要通知工廠類(lèi)知道就可以被客戶使用了。所以對(duì)產(chǎn)品部分來(lái)說(shuō),它是符合開(kāi)閉原則的;但是工廠部分好像不太理想,因?yàn)槊吭黾右环N新型車(chē),都要在工廠類(lèi)中增加相應(yīng)的創(chuàng)建業(yè)務(wù)邏輯(createBMW(int type)方法需要新增case),這顯然是違背開(kāi)閉原則的。可想而知對(duì)于新產(chǎn)品的加入,工廠類(lèi)是很被動(dòng)的。對(duì)于這樣的工廠類(lèi),我們稱(chēng)它為全能類(lèi)或者上帝類(lèi)。 
            我們舉的例子是最簡(jiǎn)單的情況,而在實(shí)際應(yīng)用中,很可能產(chǎn)品是一個(gè)多層次的樹(shù)狀結(jié)構(gòu)。由于簡(jiǎn)單工廠模式中只有一個(gè)工廠類(lèi)來(lái)對(duì)應(yīng)這些產(chǎn)品,所以這可能會(huì)把我們的上帝累壞了,也累壞了我們這些程序員。
            于是工廠方法模式作為救世主出現(xiàn)了。 工廠類(lèi)定義成了接口,而每新增的車(chē)種類(lèi)型,就增加該車(chē)種類(lèi)型對(duì)應(yīng)工廠類(lèi)的實(shí)現(xiàn),這樣工廠的設(shè)計(jì)就可以擴(kuò)展了,而不必去修改原來(lái)的代碼。
    五、工廠方法模式 
            工廠方法模式去掉了簡(jiǎn)單工廠模式中工廠方法的靜態(tài)屬性,使得它可以被子類(lèi)繼承。這樣在簡(jiǎn)單工廠模式里集中在工廠方法上的壓力可以由工廠方法模式里不同的工廠子類(lèi)來(lái)分擔(dān)。 
    工廠方法模式組成: 
           1)抽象工廠角色: 這是工廠方法模式的核心,它與應(yīng)用程序無(wú)關(guān)。是具體工廠角色必須實(shí)現(xiàn)的接口或者必須繼承的父類(lèi)。在java中它由抽象類(lèi)或者接口來(lái)實(shí)現(xiàn)。 
           2)具體工廠角色:它含有和具體業(yè)務(wù)邏輯有關(guān)的代碼。由應(yīng)用程序調(diào)用以創(chuàng)建對(duì)應(yīng)的具體產(chǎn)品的對(duì)象。 
           3)抽象產(chǎn)品角色:它是具體產(chǎn)品繼承的父類(lèi)或者是實(shí)現(xiàn)的接口。在java中一般有抽象類(lèi)或者接口來(lái)實(shí)現(xiàn)。 
           4)具體產(chǎn)品角色:具體工廠角色所創(chuàng)建的對(duì)象就是此角色的實(shí)例。在java中由具體的類(lèi)來(lái)實(shí)現(xiàn)。 
           工廠方法模式使用繼承自抽象工廠角色的多個(gè)子類(lèi)來(lái)代替簡(jiǎn)單工廠模式中的“上帝類(lèi)”。正如上面所說(shuō),這樣便分擔(dān)了對(duì)象承受的壓力;而且這樣使得結(jié)構(gòu)變得靈活 起來(lái)——當(dāng)有新的產(chǎn)品產(chǎn)生時(shí),只要按照抽象產(chǎn)品角色、抽象工廠角色提供的合同來(lái)生成,那么就可以被客戶使用,而不必去修改任何已有 的代碼。可以看出工廠角色的結(jié)構(gòu)也是符合開(kāi)閉原則的! 

    代碼如下: 

    產(chǎn)品類(lèi):

    [java] view plain copy
     
    1. abstract class BMW {  
    2.     public BMW(){  
    3.           
    4.     }  
    5. }  
    6. public class BMW320 extends BMW {  
    7.     public BMW320() {  
    8.         System.out.println("制造-->BMW320");  
    9.     }  
    10. }  
    11. public class BMW523 extends BMW{  
    12.     public BMW523(){  
    13.         System.out.println("制造-->BMW523");  
    14.     }  
    15. }  


    創(chuàng)建工廠類(lèi):

    [java] view plain copy
     
    1. interface FactoryBMW {  
    2.     BMW createBMW();  
    3. }  
    4.   
    5. public class FactoryBMW320 implements FactoryBMW{  
    6.   
    7.     @Override  
    8.     public BMW320 createBMW() {  
    9.   
    10.         return new BMW320();  
    11.     }  
    12.   
    13. }  
    14. public class FactoryBMW523 implements FactoryBMW {  
    15.     @Override  
    16.     public BMW523 createBMW() {  
    17.   
    18.         return new BMW523();  
    19.     }  
    20. }  


    客戶類(lèi):

    [java] view plain copy
     
    1. public class Customer {  
    2.     public static void main(String[] args) {  
    3.         FactoryBMW320 factoryBMW320 = new FactoryBMW320();  
    4.         BMW320 bmw320 = factoryBMW320.createBMW();  
    5.   
    6.         FactoryBMW523 factoryBMW523 = new FactoryBMW523();  
    7.         BMW523 bmw523 = factoryBMW523.createBMW();  
    8.     }  
    9. }  


     工廠方法模式仿佛已經(jīng)很完美的對(duì)對(duì)象的創(chuàng)建進(jìn)行了包裝,使得客戶程序中僅僅處理抽象產(chǎn)品角色提供的接口,但使得對(duì)象的數(shù)量成倍增長(zhǎng)。當(dāng)產(chǎn)品種類(lèi)非常多時(shí),會(huì)出現(xiàn)大量的與之對(duì)應(yīng)的工廠對(duì)象,這不是我們所希望的。

    參考http://blog.csdn.net/hguisu/article/details/7505909

     

    以上就是簡(jiǎn)單工廠模式,工廠方法模式,抽象工廠模式在這里

     

    作者:jason0539

    微博:http://weibo.com/2553717707

    博客:http://blog.csdn.net/jason0539(轉(zhuǎn)載請(qǐng)說(shuō)明出處)

     

    大云網(wǎng)官方微信售電那點(diǎn)事兒

    責(zé)任編輯:售電衡衡

    免責(zé)聲明:本文僅代表作者個(gè)人觀點(diǎn),與本站無(wú)關(guān)。其原創(chuàng)性以及文中陳述文字和內(nèi)容未經(jīng)本站證實(shí),對(duì)本文以及其中全部或者部分內(nèi)容、文字的真實(shí)性、完整性、及時(shí)性本站不作任何保證或承諾,請(qǐng)讀者僅作參考,并請(qǐng)自行核實(shí)相關(guān)內(nèi)容。
    我要收藏
    個(gè)贊
    ?
    人妻精品久久久久中文字幕一冢本| 国产小呦泬泬99精品| 国产成人乱码一二三区18| 国产在线一区二区三区AV| 国产三级精品三级男人的天堂| 欧美精品一区二区| 手机在线日本亚洲欧美视频| 久久无码精品一区二区三区| 女人扒开腿让男人狂桶30分钟| 狠狠色丁香久久婷婷综合|