閱讀796 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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.Zhaobenshan
2.修改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

  上一篇:go 關於setBuff的作用
  下一篇:go android ndk之hello world