java工廠模式的理解

【http://www.360doc.com/content/11/0824/17/3034429_142983837.shtml】

這兩天突然想學學java源代碼,不過看到一篇文章說看java源代碼要先看設計模式,這樣更容易理解源代碼的結構,所以就準備學學java設計模式,首先當然是看java創建模式的工廠模式了,剛開始直接看抽象工廠模式是什麼意思,百度百科的實在是看不懂,後來又在網上看了看其他的文章,仔細思考後,還算是理解了,現在跟大家分享下。
      首先說說簡單工廠模式,我用現實中的汽車工廠舉例子,首先有個汽車類的接口叫做Car,裏面有個開車的方法叫做drive(),然後有個吉利車的類叫做Jili,實現了car的接口,還有個奇瑞車的類叫做Qirui,也實現了Car的接口(因爲都是車嘛,當然能開了)。
       interface Car{
            public void drive(){
                     System.out.println("我開車");
            }
       class Jili implements Car{
            public Jili(){
                     System.out.println("生產一臺吉利車");
            }
            pulic void drive(){
                     System.out.println("我開吉利車");
            }
      }
      class Qirui implements Car{
            public  Qirui(){
                     System.out.println("生產一臺奇瑞車");
            }
            pulic void drive(){
                     System.out.println("我開奇瑞車");
            }
      }
那現在如果我要用Jili這個類,最基本的方式就是
      Jili jili=new Jili();
如果用Qirui這個類,最基本的方式也是
      Qirui qirui=new Qirui();
哦,那現在如果有個比亞迪車就得new Biyadi();然後同樣有個drive()的方法,這樣每個都得new個汽車對象,但是其實吉利,奇瑞和比亞迪他們都屬於汽車,同樣都有drive()方法,那是不是我們能創建一個生產汽車的工廠,然後你想要什麼汽車只要告訴工廠就可以,工廠就幫你生產了,這樣你不用管生產的細節工作(也就是new對象的過程),這樣會更好呢,到此,簡單工廠模式就出來了,簡單工廠模式就是創建具有相同特徵的類的實例,然後把創建汽車的方法靜態化,這樣就可以直接用工廠生產了,代碼如下
      class CarFactory{
             public static Car createCar(String carname){
                  if("jili".equals(carname)){
                        return new Jili();
                  }else if("qirui".equals(carname)){
                        return new Qirui();
                  }else if("biyadi".equals(carname)){
                        return new Biyadi();
                  }
            }
這就ok了,這樣如果你要生產出一臺汽車,直接調用Car car=CarFactory.createCar("jili");就可以了。
         這種工廠雖然挺好,但是如果我每次要加入一個新車都得修改工廠類來加入新的判斷語句,這樣不符合開閉原則,所以慢慢人們又想出一種更加好的生產方式,這就是工廠方法模式。
         首先我們把生產汽車的工廠類抽象出來當成一個接口,
         Interface CarFactory{
            public static Car createCar();
         }
         然後呢,讓具體工廠類實現這個生產汽車的接口,這樣就會有三個具體工廠,一個是吉利車生產工廠,一個是奇瑞車生產工廠,一個是比亞迪車生產工廠
         class JiliFactory  implements CarFactory{
            public static Car createCar(){
                  return new Jili();
            }
         }
         class QiruiFactory  implements CarFactory{
            public static Car createCar(){
                  return new Qirui();
            }
         }
         class BiyadiFactory  implements CarFactory{
            public static Car createCar(){
                  return new Biyadi();
            }
         }
         這樣做的好處就是如果我還要生產一個長城汽車,不用去修改CarFactory這個工廠,只需要再寫個長城工廠類去實現CarFactory這個接口就可以了。這就是工廠方法模式,不過工廠方法模式和簡單工廠模式的各有優點,也不能就說工廠方法模式就好,關鍵在於看實際情況去決定用哪種模式。
         隨着社會的進步,汽車種類也多了,比如分爲越野車和跑車兩個系列,而工廠方法模式一般是針對於一種系列的抽象產品的生產,而把工廠方法模式進行擴充,變成可以對多種系列的產品進行生產,這就是抽象工廠模式了。
         百度說抽象工廠模式是創建多個產品族的產品對象,那我在這解釋下什麼是產品族,現在我們還是以汽車工廠生產汽車爲例,隨着汽車行業的發展,汽車在應用上分爲越野車和跑車,這樣原來Car這個接口就不能通用,而變成了YueyeChe()和PaoChe()這兩個接口,而越野車適合在山路上跑,跑車適合在賽路上跑,所有drive的方法也改變了,代碼如下
         interface YueyeChe(){
            public driveShanlu();
         }
         interface PaoChe(){
            public driveSailu();
         }
         而吉利和奇瑞也都生產跑車和越野車,這樣大家就好理解了,跑車就是一個抽象產品族,越野車也是一個抽象產品族,而吉利跑車,吉利越野車,奇瑞跑車,奇瑞越野車是真正的類,這樣我們還有四個類
         public JiliPaoChe implements PaoChe{
            public driveSailu(){
                System.out.println("我在賽路開吉利跑車");  
            }
         }
         public QiruiPaoChe implements PaoChe{
            public driveSailu(){
                System.out.println("我在賽路開奇瑞跑車");  
            }
         }
         public JiliYueyeChe implements PaoChe{
            public driveSailu(){
                System.out.println("我在山路開吉利越野車");  
            }
         }
         public QiruiYueyeChe implements PaoChe{
            public driveSailu(){
                System.out.println("我在山路開奇瑞越野車");  
            }
         }
         車的接口和類就定義好了,相信大家也理解什麼是產品族了,下面我們該看工廠怎麼實現了,首先還是向工廠方法模式那樣,有個生產汽車的工廠接口,不過我們對這個接口進行了一些擴充,因爲Car類分成了跑車和越野車,所有我們接口也就是能生產出跑車和越野車這兩種車型
         Interface CarFactory{
            public static PaoChe createPaoChe();
 
            public static YueyeChe createYueyeChe();
         }
         和工廠方法一樣我們需要兩個真正的工廠類來生產真正的汽車,恩.....當然,吉利工廠可以生產吉利跑車和吉利越野車,奇瑞工廠可以生產奇瑞跑車和奇瑞越野車,代碼如下
         class JiliFactory  implements CarFactory{
            public static PaoChe createPaoChe(){
                  return new JiliPaoChe();
            }
            public static YueyeChe createYueyeChe(){
                  return new JiliYueyeChe();
            }
         }
         class QiruiFactory  implements CarFactory{
            public static PaoChe createPaoChe(){
                  return new QiruiPaoChe();
            }
            public static YueyeChe createYueyeChe(){
                  return new QiruiYueyeChe();
            }
         }
      ok了,抽象工廠模式也完成了,大家如果想生產一個吉利跑車,就可以JiliFactory.createPaoChe();這樣吉利跑車就出來了,不錯吧,同理如果我們還要一個比亞迪的汽車工廠只要實現CarFactory這個工廠就行了,代碼如下
      class BiyadiFactory  implements CarFactory{
            public static PaoChe createPaoChe(){
                  return new BiyadiPaoChe();
            }
            public static YueyeChe createYueyeChe(){
                  return new BiyadiYueyeChe();
            }
         }
      相信大家應該理解了什麼是抽象工廠模式,不過具體什麼情況該如果選擇哪種模式,還需要多多學習,才能融會貫通。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章