简单工厂模式+反射机制

一、首先创建一个编程语言的接口 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


 

你可能感兴趣的:(设计模式学习)