一、首先创建一个编程语言的接口 LanguageInterface
package com.design.factory;
/**
* 编程语言接口
* @author Administrator
*
*/
public interface LanguageInterface {
//具体语言类型
public void useType();
}
二、然后创建两个具体的编程语言(CType、JavaType)实现该接口
package com.design.factory;
public class CType implements LanguageInterface {
@Override
public void useType() {
System.out.println("----C语言----");
}
}
package com.design.factory;
public class JavaType implements LanguageInterface{
@Override
public void useType() {
System.out.println("----Java----");
}
}
三、接着创建一个language.properties文件用来映射具体语言的路径
c=com.design.factory.CType
java=com.design.factory.JavaType
四、再创建一个properties文件读取工具ReaderProperties
package com.design.factory;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
/**
* 编程语言读取工具
* @author Administrator
*
*/
public class ReaderProperties {
public Map getPropertyAndKey(){
Map map = new HashMap();
Properties pt = new Properties();
try {
//读取映射文件
InputStream in = getClass().getResourceAsStream("language.properties");
//从输入流读取属性列表(键和元素对)
pt.load(in);
//返回属性列表所有键的枚举
Enumeration> en = pt.propertyNames();
//逐行读取枚举的key和value并存放在map中
while(en.hasMoreElements()){
String key = (String)en.nextElement();
String value = pt.getProperty(key);
map.put(key, value);
}
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
}
五、还有就是我们的工厂类LanguageFactory
package com.design.factory;
import java.util.Map;
/**
* 编程语言工厂
* @author Administrator
*
*/
public class LanguageFactory {
public LanguageInterface getLanguageTypeByKey(String key){
try {
//获取language.properties文件的属性列表
Map map = new ReaderProperties().getPropertyAndKey();
//通过映射找到对应的类
LanguageInterface li = (LanguageInterface)Class.forName(map.get(key)).newInstance();
return li;
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
}
六、最后就是测试
package com.design.factory;
/**
* 测试
* @author Administrator
*
*/
public class TestFactory {
public static void main(String[] args){
LanguageFactory lf = new LanguageFactory();
lf.getLanguageTypeByKey("c").useType();
}
}
测试结果为
----C语言----
注:使用反射的目的就是为了规避工厂中使用switch case 或if else 判断,而且如果有什么需要新加的产品也无需修改工厂类,只需新加一个产品类实现产品接口,再修改一下properties文件就可以做到。
下面我们新加一个PythonType
package com.design.factory;
public class PythonType implements LanguageInterface {
@Override
public void useType() {
System.out.println("----Python----");
}
}
再修改一下language.properties文件
c=com.design.factory.CType
java=com.design.factory.JavaType
python=com.design.factory.PythonType
然后测试一下
package com.design.factory;
/**
* 测试
* @author Administrator
*
*/
public class TestFactory {
public static void main(String[] args){
LanguageFactory lf = new LanguageFactory();
lf.getLanguageTypeByKey("python").useType();
}
}
执行结果:
----Python----
如要查看不带反射的简单工厂模式请查看http://blog.csdn.net/fateforever/article/details/78361289