JAVA設計模式之工廠系列

通過該項目談我對工廠模式的認識:

 哎,全是白話啊!
  "老張開車去東北"
***********************************************************第一步*************************************************************** 
1、首先定義一個Car類表示車,該輛車有一個run()方法,
 這輛車可以由老張自己new出來;但是這樣的話老張可以自己new出很多輛新車,並且每一輛和每一輛都不同;
2、現在在Car類中採用單例模式,實現讓老張不能自己new,但是可以get到一輛車,不過這時每次得到的是同一輛車;
 單例模式三要素:
 * 將構造方法定義爲private,這樣別人就不能new啦!
  private Car(){}
 * 定義一個靜態屬性(當然就是自己啦!如果定義的是一個List<Car> cars 的話,那就是多例啦!嘿嘿...)
  private static Car car = new Car();
 * 提供一個靜態方法返回上面的car
  private static Car getInstance(){
   return car();
  }
 這時老張每次調用getInstance()方法獲得的都是同一個Car對象

***********************************************************第二步*************************************************************** 
  "任意定製交通工具的類型"
  
現在只能是開車去東北,如果想開飛機或是騎掃帚去的話該如何實現呢???
3、那就只能採用多態啦!
 * 定義一個接口Movable(可以移動滴東東啦!)
  具體的交通工具實現這個接口。
 * 這樣的話,老張在每次去東北之前就可以自己new出想要的交通工具啦!
  Movable m = new XXX();    //XXX爲想要得到的交通工具的名稱,如Car啦,Plane啦,等等...

***********************************************************第三步***************************************************************  
  "任意定製交通工具的類型和生產過程"
  
今天我們要探討的是工廠模式,當然涉及到的是如何用工廠建造來建造(new)老張想要的交通工具啦!
4、爲不同的交通工具定義不同的工廠類,如CarFactory 、 PlaneFactory 等等...
 工廠類內部當然要提供一個createXxx()方法來返回一個相應的交通工具實例啦!Xxx爲new出來的交通工具的名稱, 如Car啦,Plane啦,等等...
 
好的,到目前爲止似乎看起來工廠模式不錯,但是還不完善啊!如果說我們有很多種不同的交通工具的話,我們就需要定義很多個工廠類,會很麻煩滴!
5、好,我們來解決上面這個問題,同樣採用多態的方法,和第二步中的類似:
 我們定義一個接口,該接口的名字爲:VehicleFactory,提供一個create()方法,相信大家一看就明白啦!
 對,這個工廠就是用來建造交通工具的,但是它的create方法沒有確定到底要建造哪種類型得交通工具,
 具體new出來的實例要看實現該接口的具體的工廠如何實現啦!
 VehicleFactory vf = new XxxFactory();   //XxxFactory就爲具體的某種交通工具的建造工廠的名稱啦!
 所以,直接 vf.create(); 就會返回老張想要得具體的交通工具的實例啦!
 好,現在我們只要修改XxxFactory就可以變化我們想要 得到的交通工具了,當然,如果我們把XxxFactory寫道配置文件中的話,我們不用修改代碼,
 直接修改配置文件就OK啦!
 
歐了,暫時我們就先寫道這裏吧!嘿嘿...

***********************************************************第四步***************************************************************
  "老張開着車,手持AK47,喫着蘋果去東北"
現在我們要探討的就不只是交通工具一個產品了,而是一系列產品,包括武器,食品等等...
這時老張可以"開着車,手持AK47,喫着蘋果去東北",也可以"起着掃帚,拿着魔法棒,喫着毒蘑菇去東北"
我們就需要兩套產品:

解決方案:
 * 定義一個抽象類(也可以爲接口)AbstractFactory,該類提供三個不同的抽象的方法:
  CreateVehicle()、CreateWeapon()、CreateFood() 分別返回Vehicle,Weapon,Food,
  Vehicle,Weapon,Food爲三個抽象類,其中分別封裝了抽象方法:run();shoot();printName();
   Car、broom從Vehicle類繼承並實現其方法run();
   AK47、MagicStick從Weapon繼承並實現其方法shoot();
   Apple、Mushroom從Food繼承並實現其方法printName();
 * DefaultFactory 和 MagicFactory 分別繼承並實現了AbstractFactory類的三個方法:
  DefaultFactory 分別: return new Car();
              return new AK47();
              return new Apple();
  MagicFactory   分別:return new Broom();
                 return new MagicStick();
                 return new Mushroom();
  
  * 下面就是定義的兩個Factory :DefaultFactory和MagicFactory 分別生產出兩套產品,再調用其中的方法:
   run(); shoot(); printName();
   
   
DefaultFactory 類中的方法:createCar(),createAK47(),createApple() 分別返回Car 、AK47 、Apple
MagicFactory 類中的方法:      createBroom(),createMagicStick(),createMushroom() 分別返回 Broom 、MagicStick 、 Mushroom

Car和Broom類中的方法:run()
AK47和MagicStick類中的方法:shoot()
Apple和Mushroom類中的方法:printName()

***********************************************************第五步***************************************************************
好,現在我們還是回到最初的狀態"老張開車去東北"
我們要從配置文件中讀取信息來生產老張具體要求的交通工具是什麼!?

現在有一個Movable接口,提供一個run()方法,兩個類Car和Train實現該接口
我們知道當老張要得到自己想要得交通工具時需要執行下面的語句:
 Movable m = new Car();  或是   Movable m = new Train();
這時還是會需要去改代碼才能實現滴!那麼如何才能不接觸代碼就能實現呢,答案就是配置文件啦!嘿嘿...
這裏我們採用properties文件,詳細講解當然要去看老馬的tank大戰視頻啦!不過在這裏這個不是重點,可以留作以後慢慢研究的啦!
1、建立spring.properties配置文件,在其中輸入配置信息如下:
 VehicleTypeName=com.bjsxt.factory.Car(注意等號兩邊不要加空格!!!)
2、讀取的代碼就直接寫給大家:
 Properties props = new Properties();
 props.load(Test.class.getClassLoader().getResourceAsStream(com/bjsxt/factory/spring.properties));
 String vehicleTypeName = props.getProperty("VehicleTypeName");
//  下面就要運用反射機制了
 Object o = Class.forName(vehicleTypeName);
 Movable m = (Movable)o;
 m.run();
好了,寫好了,當然需要你自己處理異常哦! 我這裏沒有寫。這時老張得到的就是一輛car,只要修改配置文件內容如下:
 VehicleTypeName=com.bjsxt.factory.Train 就可以得到一輛火車啦!
 需要注意的是,此時在Car和Train中不要將構造方法設爲private的啊!

上面的內容還算簡單吧!還望大家好好理解哦,工廠模式很重要滴!下面我們就要討論spring中如何運用工廠方法了...

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章