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 }

 

posted @ 2020-09-07 19:24  阿部由佳  阅读(83)  评论(0编辑  收藏  举报