Java中工廠、配置文件和反射學習
學習程序的最好方式就是編代碼實現它,這裏我們假設一個場景為要開一個晚會,晚會的流程為:1.晚會開始;2.唱歌;3.舞蹈;4.小品;5結束。
一、傳統方法
1、新建java項目:party
2、在party項目中新建類EveningParty
package com.gmail.lsgjzhuwei; public class EveningParty { public static void main(String[] args) { } }在EveningParty類中實現晚會的流程,新建process函數,在process函數中實現整個晚會流程,具體代碼為:
public void process() { //1.晚會開始 //2.唱歌 //3.舞蹈 //4.小品 //5.晚會結束 System.out.println("晚會開始"); //唱歌 Singable singable = new Liudehua(); singable.sing(); //跳舞 Dancleable dancleable = new Xiaohudui(); dancleable.dance(); //小品 Essayable essayable = new Zhaobenshan(); essayable.essay(); }
這裏出現了三個類sIngable、Dancleable、和Essayable,為新建的接口,為了程序擴展方麵,需要建立三個接口sIngable、Dancleable、和Essayable,分別用於實現唱歌跳舞和小品,具體的代碼為:
package com.gmail.lsgjzhuwei; /** * @author Leo Chu *Singable接口用於實現唱歌 * 2014-8-24 */ public interface Singable { public void sing(); }
package com.gmail.lsgjzhuwei; /** * @author Leo Chu *Dancleable接口用於實現跳舞 * 2014-8-24 */ public interface Dancleable { public void dance(); }
package com.gmail.lsgjzhuwei; /** * @author Leo Chu *Essayable接口用於實現小品 * 2014-8-24 */ public interface Essayable { public void essay(); }
3.分別定義歌手、舞者和小品表演者分別實現上述接口
3.1定義Liudehua類實現Singable接口
package com.gmail.lsgjzhuwei; public class Liudehua implements Singable { public void sing() { // TODO Auto-generated method stub System.out.println("劉德華演唱中國人"); } }
3.2定義Naying實現Sinable接口
package com.gmail.lsgjzhuwei; public class Naying implements Singable { public void sing() { System.out.println("那英演唱:霧裏看花"); } }
3.3定義Xiaohudui實現Dancleable接口
package com.gmail.lsgjzhuwei; public class Xiaohudui implements Dancleable { public void dance() { // TODO Auto-generated method stub System.out.println("小虎隊舞蹈:愛"); } }
3.4定義Chenailian實現Dancleable接口
package com.gmail.lsgjzhuwei; public class Chenailian implements Dancleable { public void dance() { // TODO Auto-generated method stub System.out.println("陳愛蓮舞蹈:天鵝舞"); } }
3.5定義Zhaobenshan實現Essayable接口
package com.gmail.lsgjzhuwei; public class Zhaobenshan implements Essayable { public void essay() { // TODO Auto-generated method stub System.out.println("趙本山小品:賣乖"); } }
3.6定義Liuqian實現Essayable接口
package com.gmail.lsgjzhuwei; public class Liuqian implements Essayable { public void essay() { // TODO Auto-generated method stub System.out.println("劉謙魔術:水中撈月"); } }4.修改主函數中代碼
package com.gmail.lsgjzhuwei; public class EveningParty { public static void main(String[] args) { new EveningParty().process(); } public void process() { //1.晚會開始 //2.唱歌 //3.舞蹈 //4.小品 //5.晚會結束 System.out.println("晚會開始"); //唱歌 Singable singable = new Liudehua(); singable.sing(); //跳舞 Dancleable dancleable = new Xiaohudui(); dancleable.dance(); //小品 // Essayable essayable = new Zhaobenshan(); essayable.essay(); System.out.println("晚會結束"); } }
OK,程序可以正常運行。
但是程序這麼寫的話會出現一個問題:每次更好演員的時候需要修改晚會類的代碼,這就給程序的擴展和維護帶來了不便。那應該怎麼做呢?可不可以吧這些麻煩的修改部分外包給一個代理去做,由代理類完成演員的修改,這就是我們下麵要介紹的一種方法:用Factory類做代理負責代碼的修改。
二/利用factory類,把需要變化的部分放到factory類中
1.在上麵程序的基礎上新建Factory類,
package com.gmail.lsgjzhuwei; import java.util.ResourceBundle; public class Factory { public Singable getSingable() { return new Liudehua(); } public Dancleable getDancleable() { return new Xiaohudui(); } public static Essayable getEssayable() { return new Zhaobenshan(); } }
2.修改晚會類代碼
package com.gmail.lsgjzhuwei; public class EveningParty { public static void main(String[] args) { new EveningParty().process(); } public void process() { //1.晚會開始 //2.唱歌 //3.舞蹈 //4.小品 //5.晚會結束 System.out.println("晚會開始"); // //唱歌 // Singable singable = new Liudehua(); // singable.sing(); // // //跳舞 // Dancleable dancleable = new Xiaohudui(); // dancleable.dance(); // // //小品 // Essayable essayable = new Zhaobenshan(); // essayable.essay(); Factory factory = new Factory(); factory.getSingable().sing(); factory.getDancleable().dance(); factory.getEssayable().essay(); System.out.println("晚會結束"); } }
OK,也是可以運行的
用這種方法不用修改晚會類,但是還是要修改代碼,還有一種方法就是將演員的實例類寫入配置文件
三、映射方法
1.在上麵代碼的基礎上,在src目錄下新建party.properties類,將演員的實例類寫入配置文件,代碼為:
Singable = com.gmail.lsgjzhuwei.Liudehua Dancleable = com.gmail.lsgjzhuwei.Xiaohudui Essayable = com.gmail.lsgjzhuwei.Zhaobenshan2.修改Factory類中調用演員類的代碼:
package com.gmail.lsgjzhuwei; import java.util.ResourceBundle; public class Factory { public static Singable getSingable() { String className = ResourceBundle.getBundle("party").getString("Singable"); try { Object obj = Class.forName(className).newInstance(); return (Singable) obj; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); throw new RuntimeException("對象不正確"); } } public static Dancleable getDancleable() { String className = ResourceBundle.getBundle("party").getString("Dancleable"); try { Object obj = Class.forName(className).newInstance(); return (Dancleable) obj; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); throw new RuntimeException("對象不正確"); } } public static Essayable getEssayable() { String className = ResourceBundle.getBundle("party").getString("Essayable"); try { Object obj = Class.forName(className).newInstance(); return (Essayable) obj; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); throw new RuntimeException("對象不正確"); } } }
3.不用修改晚會類代碼,執行程序,OK正確。
最後更新:2017-04-03 05:40:02