Java--工厂模式
设计模式:
是一套被反复使用,多数人知晓的,经过分类编目的,代码设计经验总结。
工厂模式:
实例化对象,用工厂方法代替new操作。
工厂模式包括工厂方法模式和抽象工厂模式
抽象工厂模式是工厂方法模式的扩展
意图:
定义一个接口来创建对象,但是让子类来决定那些类需要被实例化
工厂方法把实例化的工作推迟到子类中实现
什么时候适合工厂模式:
有一组类似的对象需要创建。
在编码是不能遇见需要创建那种类的实例
系统需要考虑扩张性,不依赖于产品类实例如何被创建
首先客户端需要创建多样的发型
package com.nyan.factory; /** * client * @author Administrator * */ public class HairTest { public static void main(String[] args) { // HairInterface left = new LeftHair(); // left.drow(); // HairInterface right = new RightHair(); // right.drow(); HairFactory factory = new HairFactory(); factory.getHair("left").drow(); factory.getHairByClass("com.nyan.factory.RightHair").drow(); factory.getHairByClassKey("left").drow(); } }
通过工厂替客户端创建格式各类的发型:
package com.nyan.factory; import java.util.Map; /** * 发型工厂 * @author Administrator * */ public class HairFactory { public HairInterface getHair(String key){ if("left".equals(key)){ return new LeftHair(); }else if("right".equals(key)){ return new RightHair(); } return null; } /** * 利用反射,根据类名生成对象 * @return */ public HairInterface getHairByClass(String className){ try { HairInterface hair = (HairInterface)Class.forName(className).newInstance(); return hair; } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { e.printStackTrace(); } return null; } 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 | IllegalAccessException | ClassNotFoundException e) { e.printStackTrace(); } return null; } }
利用抽象方法提供实现各种发型的类
package com.nyan.factory; /** * 发型接口 * @author Administrator * */ public interface HairInterface { public void drow(); }
package com.nyan.factory; public class LeftHair implements HairInterface { @Override public void drow() { System.out.println("---左分发型---"); } } RightHair、InHair。。。
利用配置文件实现类的映射
right=com.nyan.factory.RightHair
left=com.nyan.factory.LeftHair
读取配置文件:
package com.nyan.factory; import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import java.util.Properties; public class PropertiesReader { public Map<String,String> getProperties(){ Properties props = new Properties(); Map<String,String> map = new HashMap<String, String>(); InputStream in = getClass().getResourceAsStream("type.properties"); try { props.load(in); Enumeration enumeration = props.propertyNames(); while (enumeration.hasMoreElements()) { String key = (String) enumeration.nextElement(); String value = props.getProperty(key); map.put(key, value); } return map; } catch (IOException e) { e.printStackTrace(); } return null; } }