Enumeration在这里我并不推荐使用,而是推荐使用Iterator接口。此接口的功能与 Iterator 接口的功能是重复的。此外,Iterator 接口添加了一个可选的移除操作,并使用较短的方法名。新的实现应该优先考虑使用 Iterator 接口而不是 Enumeration 接口。
property工具类的实现
public class propertiesReader { public Map<String,String> getProperties() { Properties props=new Properties(); Map<String,String> map=new HashMap<String,String>(); try { InputStream in=getClass().getResourceAsStream("type.properties"); props.load(in); Enumeration en = props.propertyNames(); while(en.hasMoreElements()) { String key = (String) en.nextElement(); String propery = props.getProperty(key); map.put(key, propery); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return map; } }
我们现在有动物,植物,两个对象,这两个对象可以抽象出一个对象,生物;其中,动物,植物,都分别具有自己的独有属性,此时如果采用工厂模式,是否可以对动物,植物,进行增删改查(自我感觉不适用);其次,如果是生物中的方法,是否可以通过工厂模式实现,比如呼吸(自我感觉适用)。
因此,针对于工厂模式来说,适用于,在一个方法中,使用了相同属性的不同对象,如果在一个方法中,使用的不同的属性,个人感觉,不适用工厂模式
根据类的名称来创建对象 反射机制
prpperties文件的读取类
@设计模式---工厂模式之 工厂方法模式
1.创建一个接口,如:HairInterface,有个抽象方法draw。
public interface HairInterface { public void draw(); }
2.创建实现接口的子类,如:LeftHair、RightHair、InHair。
public class LeftHair implements HairInterface { @Override public void draw() { System.out.println("左偏分发型"); } }
3.创建工厂类,如:HairFactory,根据类的名称来生产对象。
public HairInterface getHairByClass(String className){ try { HairInterface hair=(HairInterface) Class.forName(className).newInstance(); return hair; } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return null; }
4.通过映射文件,简化类的名称,如:type.properties。
left=onetry.DesigntonDemo.LeftHair right=onetry.DesigntonDemo.RighttHair in=onetry.DesigntonDemo.InHair
5.创建properties文件的读取工具,如:PropertiesReader。
public class PropertiesReader { public Map<String,String> getProperties(){ Properties props = new Properties(); Map<String,String> map = new HashMap<String,String>(); try{ //以流的形式读取properties文件 InputStream in = getClass().getResourceAsStream("type.properties") ; props.load(in); Enumeration en = props.propertyNames(); while(en.hasMoreElements()){ String key = (String) en.nextElement(); String property = props.getProperty(key); map.put(key, property); } }catch(Exception e){ e.printStackTrace(); } return map; } }
6.修改HairFactory,用PropertiesReader读取 替换 原来的className。
public HairInterface getHairByClassKey(String key){ try { Map<String,String> map = new PropertiesReader().getProperties(); HairInterface hair=(HairInterface)Class.forName(map.get(key)).newInstance(); return hair; } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return null; }
7.测试用例
HairFactory factory = new HairFactory(); //HairInterface left = factory.getHairByClass("onetry.DesigntonDemo.LeftHair"); HairInterface hair = factory.getHairByClassKey("in"); hair.draw();