`

工厂模式:不修改工厂,只增删类对应修改配置文件就OK啦!

阅读更多




我们的最终目的是:不修改工厂,只需添加新的类和配置文件就能实现工厂生产该子类对象。这种开发思路在我们的开发过程中是随处可见的,比如在:Spring , Hibernate,Struts中应用得相当的普遍,理解了这一点对我们学习SSH那是非常的顺手哦!

当然具体的用法需要在实际的项目中来体验和优化!

更详细的介绍请看本Page下载文件:CarFactory_code.rar


package com.cdl.dp.factory2;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.InvalidPropertiesFormatException;
import java.util.Properties;
import java.util.Scanner;

//参考:http://www.blogjava.net/jzgl-ever/archive/2008/07/26/217704.html
//参考:interfaceAndFactory.CarFactory
//参考:package com.cdl.dp.factory;
interface Car {
	public void run();

	public void stop();
}

class Benz implements Car {
	public void run() {
		System.out.println("Benz开始启动了。。。。。");
	}

	public void stop() {
		System.out.println("Benz停车了。。。。。");
	}
}

class Ford implements Car {
	public void run() {
		System.out.println("Ford开始启动了。。。");
	}

	public void stop() {
		System.out.println("Ford停车了。。。。");
	}
}

class Toyota implements Car {
	public void run() {
		System.out.println("Toyota开始启动了。。。");
	}

	public void stop() {
		System.out.println("Toyota停车了。。。。");
	}
}

// 扩展一个我自己的品牌,O(∩_∩)O哈哈~
class Cdliang implements Car {
	public void run() {
		System.out.println("Cdliang开始启动了。。。");
	}

	public void stop() {
		System.out.println("Cdliang停车了。。。。");
	}
}

class BYD implements Car {
	public void run() {
		System.out.println("BYD开始启动了。。。");
	}

	public void stop() {
		System.out.println("BYD停车了。。。。");
	}
}

class ProduceCar {//通过carClassPath反射,生成一个car实例
	public static Car getCarInstance(String carClassPath) {
		Car c = null;
		try {
			c = (Car) Class.forName(carClassPath).newInstance();
			// 利用反射得到汽车类型,path.package.ClassName当然我们要捕获异常啦
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		return c;
	}
}

// 写一个加载XML文件的类,加载后就好供我们的程序使用了噻
class InitProperties {
	public static Properties getProperties() {// 静态的方法可以让我们不实例化就直接调用
		Properties pro = new Properties();
		try {
			pro.loadFromXML(new FileInputStream("cdl2.xml"));
		} catch (InvalidPropertiesFormatException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		System.out.println(pro);
		return pro;
	}
}

public class CarFactory {

	public static void main(String[] args) {

		Properties pro = new Properties();
		pro = InitProperties.getProperties();

		System.out.println("请输入你要的车品牌:");
		Scanner sc = new Scanner(System.in);
		String carName = sc.nextLine().trim();

		Car c = ProduceCar.getCarInstance((String) pro.get(carName));
		if (c != null) {// 如果这类存在那么就调用它的方法
			c.run();
			c.stop();
		} else {
			System.out.println("造不了这种汽车。。。");
		}
	}

}

运行结果:
{Benz=com.cdl.dp.factory2.Benz, Ford=com.cdl.dp.factory2.Ford, BYD=com.cdl.dp.factory2.BYD, Toyota=com.cdl.dp.factory2.Toyota, Cdliang=com.cdl.dp.factory2.Cdliang}
请输入你要的车品牌:
BYD
BYD开始启动了。。。
BYD停车了。。。。






.
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics