简单工厂模式+反射机制

来源:互联网 发布:淘宝一元秒杀网在那 编辑:程序博客网 时间:2024/06/05 04:56

一、首先创建一个编程语言的接口 LanguageInterface

package com.design.factory;/** * 编程语言接口 * @author Administrator * */public interface LanguageInterface {//具体语言类型public void useType();}

二、然后创建两个具体的编程语言(CType、JavaType)实现该接口

package com.design.factory;public class CType implements LanguageInterface {@Overridepublic void useType() {System.out.println("----C语言----");}}
package com.design.factory;public class JavaType implements LanguageInterface{@Overridepublic void useType() {System.out.println("----Java----");}}

三、接着创建一个language.properties文件用来映射具体语言的路径

c=com.design.factory.CTypejava=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<String, String> getPropertyAndKey(){Map<String, String> map = new HashMap<String, String>();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<String, String> 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 {@Overridepublic void useType() {System.out.println("----Python----");}}

再修改一下language.properties文件

c=com.design.factory.CTypejava=com.design.factory.JavaTypepython=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


 

原创粉丝点击