我们的最终目的是:不修改工厂,只需添加新的类和配置文件就能实现工厂生产该子类对象。这种开发思路在我们的开发过程中是随处可见的,比如在: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停车了。。。。
.
分享到:
相关推荐
9. 配置svn权限:我们需要修改一下权限配置文件,例如将anon-access = read改为anon-access = write。 10. 导出项目:其他的开发人员可以从工厂中导出已有的项目,右键——>SVN Checkout,出现下面的对话框点击ok,...
- **String**:不可变字符串,适用于频繁读取而很少修改的情况。 - **StringBuilder**:可变字符串,线程不安全,效率高于StringBuffer。 - **StringBuffer**:线程安全的可变字符串,适用于多线程环境。 ##### ...
以后该业务要变,就十分方便,只需要在中间层的定位器,配置一下就可以了,如果采用XML或文件配置,不需要修改任何程序,客户的业务已经发生改变。当然会采用名字调用等技术了。相关代码如下: TBOService= class...
ABB机器人系统信号是ABB机器人控制系统中的关键组成部分,用于实现机器人与其他设备或系统的交互。系统输入和输出信号分别对应...通过正确配置和利用这些信号,可以实现更复杂的自动化流程并与工厂的其他设备无缝集成。
如果这些文件对应的CPU型号不是当前项目中使用的CPU型号,可以将这些文件复制到当前工程项目中,并调整OB1中的内容以适应项目需求。 **使用FB125进行故障诊断**: 为了利用FB125进行故障诊断,需要在OB1、OB82和OB...
要想立即实现一种效果模式,只需按下按钮数组中所要模式对应的钮即可,下面是对它们的说明: 用于移动EQ模块。连续按下时,把EQ模块从输入部分移到输出部分。 此键用于移到分谐波合成器模块。 用来移到分频器模块...