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