一个简单的 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: 194 · Permalink
Categorized in: Design Patterns, Java · Tagged with: , ,
1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...

Leave a Reply


  • Highest Rated

  • My PicasaPhotos

    monkey.jpeg

    6f0d213d3701a9d49f3d6282.jpg

    37decb2aa5f8ab88023bf6b7.jpg

  • RSS My del.icio.us

  • My RSS