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 }