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();