一个简单的 POJO factory 实现
很简单,看看代码就明白了,不比 “hello,world” 复杂
。 主入口类 ServiceFactory 类似于 spring 的 BeanFactory:
/**
*
* @author javafuns
*/
public class ServiceFactory {
private static Map beansMap = Configuration.getInstance().getAllServices();
private ServiceFactory() {
}
public static T getService(Class superClaz) throws XxxException {
String serviceClazShortName = BeanUtil.getClassShortName(superClaz);
String impl = beansMap.get(serviceClazShortName);
if (isBlank(impl)) {
throw new XxxException();
}
try {
return (T) Class.forName(impl, true, ServiceFactory.class.getClass().getClassLoader()).newInstance();
} catch (InstantiationException e) {
throw new XxxException("xxxx", e);
} catch (IllegalAccessException e) {
throw new XxxException("xxxx", e);
} catch (ClassNotFoundException e) {
throw new XxxException("xxxx", e);
}
}
private static boolean isBlank(String s) {
return (s == null || "".equals(s.trim()));
}
public static void main(String[] args) {
try {
Map map = ServiceFactory.getService(Map.class);
map.put("key", "value");
System.out.println(map.get("key"));
List list = ServiceFactory.getService(List.class);
list.add("hello");
list.add("world");
for (String s : list) {
System.out.println(s);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
使用Configuration类读取(属性)配置文件:
/**
*
* @author javafuns
*/
class Configuration {
private static Configuration instance = new Configuration();
private Map serviceMap = new HashMap();
private Configuration(String filename) {
try {
Properties properties = new Properties();
properties.load(getClass().getResourceAsStream("/" + filename));
String services = properties.getProperty("services", "");
extractService(services);
} catch (Exception e) {
e.printStackTrace();
}
}
protected Configuration() {
this("config.properties");
}
public static Configuration getInstance() {
return instance;
}
/**
* extract all services definitions from configuration.properties.
* @param services
*/
private void extractService(String serviceDefs) {
if (serviceDefs != null) {
serviceDefs = serviceDefs.trim();
if (serviceDefs.startsWith("{") && serviceDefs.endsWith("}")) {
String[] services = serviceDefs.substring(1, serviceDefs.length() - 1).split(",");
for (String service : services) {
String[] kv = service.split(":");
if (kv.length == 2) {
this.serviceMap.put(kv[0].trim(), kv[1].trim());
}
}
}
}
}
public String getService(String superClaz) {
return this.serviceMap.get(superClaz);
}
public Map getAllServices() {
return Collections.unmodifiableMap(this.serviceMap);
}
}
BeanUtil只有一个类方法,用于获取类名:
/**
*
* @author javafuns
*/
public class BeanUtil {
private BeanUtil() {
}
public static String getClassShortName(Class clazz) {
String className = clazz.getName();
return className.substring(className.lastIndexOf('.') + 1);
}
}
最后来看一下属性文件是如何定义的:
services={\
Map:java.util.HashMap,\
List:java.util.ArrayList,\
Set:java.util.HashSet\
}
test= test
By javafuns on September 25, 2009 at 14:07 ·
Views: 171 · Permalink
Categorized in: Design Patterns, Java · Tagged with: DesignPatterns, IOC, Java
Categorized in: Design Patterns, Java · Tagged with: DesignPatterns, IOC, Java


(