JAVA设计模式 -- 工厂方法模式设计举例
1 与之前的简单工厂模式举例相似,同样通过TV这个生活中比较常见的物件来体验JAVA设计模式中的工厂模式的设计感觉 2 // 测试类Test.java: 3 public class Test { 4 public static void main(String[] args) { 5 /*TVFactory tvFactory = new HaierTVFactory(); 6 TV tv = tvFactory.produce(); 7 tv.display();*/ 8 9 //通过配置文件获取 10 TVFactory tvFactory = (TVFactory) XMLUtil.getBean(); 11 TV tv = tvFactory.produce(); 12 tv.display(); 13 } 14 } 15 // 海尔电视类 16 public class HaierTV implements TV { 17 @Override 18 public void display() { 19 System.out.println("海尔电视正在播放中..."); 20 } 21 } 22 // 海信电视类 23 public class HisenseTV implements TV { 24 @Override 25 public void display() { 26 System.out.println("海信电视正在播放中..."); 27 } 28 } 29 // 海尔电视工厂类 30 public class HaierTVFactory implements TVFactory { 31 @Override 32 public TV produce() { 33 TV tv = new HaierTV(); 34 return tv; 35 } 36 } 37 // 海信电视工厂类 38 public class HisenseTVFactory implements TVFactory { 39 @Override 40 public TV produce() { 41 return new HisenseTV(); 42 } 43 } 44 // 电视工厂接口,就像一些大型的集团工厂一样,他们可以为不同的客户生产不同的商品 45 public interface TVFactory { 46 public TV produce(); 47 } 48 // 电视接口 49 public interface TV { 50 public void display(); 51 } 52 53 // 同样的 不管是海尔电视,还是海信电视,都需要去实现TV这个父接口, 54 // 同时,海尔工厂和海信工厂也需要实现TVFactory这个父接口。 55 // 这样一来,当客户提需求的时候,如果客户需要一台海尔电视机,我们只需要创建一个海尔电视工厂,让他去生产一 56 // 台海尔电视机就可以了,至于这台电视机如何生产的,客户是不需要知道这些细节的; 57 58 // 最后,我们同样可以通过xml配置文件来获取客户的需求 59 // 工具类 60 public class XMLUtil { 61 public static Object getBean(){ 62 try { 63 //创建DOM文档对象 64 DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); 65 DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); 66 Document doc = documentBuilder.parse(new File("res/FactoryMethodConfig.xml")); 67 //获取包含类名的文本节点 68 NodeList nodeList = doc.getElementsByTagName("className"); 69 Node node = nodeList.item(0).getFirstChild(); 70 String className = node.getNodeValue().trim(); 71 //通过反射,将读取出来的类名字符串转换为对象 72 Class<?> aClass = Class.forName(className); 73 Object o = aClass.newInstance(); 74 return o; 75 } catch (Exception e) { 76 e.printStackTrace(); 77 return null; 78 } 79 } 80 }