昨天晚上做了一个工厂模式的练习,通过XML配置把工厂要生成的具体类传给工厂,这样当有更多类实现接口时就只需要修改一下XML配置就可以了,省去了修改代码的麻烦。
睡觉时想了一点可以把工厂类要用的一些类设计为单例,那样可以效果更好一点。本人认为单例一般有三个步骤,具体的在代码中有详细说明,只是浅见,希望指教。
把代码贴出来一下,有什么地方可以改进的地方大家可以发表一下意见,共同提高。
car接口
package myFactoryDemo;
public interface car {
void run();
void stop();
}
smallcar 类
package myFactoryDemo;
public class smallcar implements car {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("smallcar is running ");
}
@Override
public void stop() {
System.out.println("smallcar is stopped ");
}
}
bigcar 类
package myFactoryDemo;
public class bigcar implements car {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("bigcar is running ");
}
@Override
public void stop() {
// TODO Auto-generated method stub
System.out.println("bigcar is stopped ");
}
}
把实现了car接口的类都生成XML,放到XML文件中
package myFactoryDemo;
import java.io.* ;
import java.util.* ;
public class beforeFactory
{
public static void main(String args[]) throws Exception
{
Properties p = new Properties() ;
p.setProperty("s","myFactoryDemo.smallcar") ;
p.setProperty("b","myFactoryDemo.bigcar") ;
p.storeToXML(new FileOutputStream("zhw.xml"),"fhqxawfnh") ;
p.loadFromXML(new FileInputStream("zhw.xml")) ;
System.out.println(p) ;
}
};
测试主类
package myFactoryDemo;
import java.util.Properties;
public class myFactory {
public static void main(String args[]) {
Properties p = new Properties();
p = InitXML.getInstance().getPropertiesInit();
System.out.println(p);
// 加入一个可以从键盘输入数据的类
System.out.print("输入要使用的子类代码:");
String code = new InputData().getString();
car f = Factory.getInstance().getFruitInstance(p.getProperty(code));
if (f != null) {
f.run();
f.stop();
} else {
System.out.println("没有发现这个类型。");
}
}
}
测试主类要用到几个工具类,以下列出,不再一一介绍。
package myFactoryDemo;
import java.io.FileInputStream;
import java.util.Properties;
public class InitXML {
//单例模式第一步 把本类的构造函数设为私有
private InitXML(){}
//单例模式第二步 生成一个自身类类型的静态私有成员变量
private static InitXML initxml = new InitXML();
public Properties getPropertiesInit() {
Properties p = new Properties();
try {
p.loadFromXML(new FileInputStream("zhw.xml"));
} catch (Exception e) {
}
return p;
}
//单例模式第三步 公共静态方法返回自身类型的静态变量
public static InitXML getInstance() {
return initxml;
}
}
package myFactoryDemo;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class InputData {
BufferedReader buf = null;
public InputData() {
buf = new BufferedReader(new InputStreamReader(System.in));
}
public String getString() {
String str = null;
try {
str = buf.readLine();
} catch (Exception e) {
}
return str;
}
}
package myFactoryDemo;
public class Factory {
private static Factory carfactory = new Factory();
private Factory(){}
public static Factory getInstance(){
return carfactory;
}
public car getFruitInstance(String type) {
car f = null;
// 通过Class类完成
try {
f = (car) Class.forName(type).newInstance();
} catch (Exception e) {
System.out.println(e);
}
return f;
}
}