[color=olive]
[size=large]
我们的最终目的是:不修改工厂,只需添加新的类和配置文件就能实现工厂生产该子类对象。这种开发思路在我们的开发过程中是随处可见的,比如在:Spring , Hibernate,Struts中应用得相当的普遍,理解了这一点对我们学习SSH那是非常的顺手哦!
当然具体的用法需要在实际的项目中来体验和优化!
更详细的介绍请看本Page下载文件:CarFactory_code.rar
[/size]
[/color]
.
[size=large]
我们的最终目的是:不修改工厂,只需添加新的类和配置文件就能实现工厂生产该子类对象。这种开发思路在我们的开发过程中是随处可见的,比如在:Spring , Hibernate,Struts中应用得相当的普遍,理解了这一点对我们学习SSH那是非常的顺手哦!
当然具体的用法需要在实际的项目中来体验和优化!
更详细的介绍请看本Page下载文件:CarFactory_code.rar
[/size]
[/color]
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停车了。。。。
.