JAVA设计模式 -- 简单工厂模式设计举例

 1 通过电视机这个生活中的例子,理解简单工厂设计模式 :
 2 
 3 测试类Test.java:
 4 public static void main(String[] args) throws Exception {
 5         //直接访问
 6 //        TV tv = TVFactory.produceTV("Haier");
 7 //        tv.display();
 8         //通过xml配置进行访问
 9         String brandName = XMLUtilTV.getBrandName();
10         TV tv = TVFactory.produceTV(brandName);
11         tv.display();
12     }
13 通过以上测试类代码可以,我们分别创建:
14 // 海信电视类
15 public class HisenseTV implements TV {
16     @Override
17     public void display() {
18         System.out.println("海信电视正在播放中...");
19     }
20 }
21 // 海尔电视类
22 public class HaierTV implements TV {
23     @Override
24     public void display() {
25         System.out.println("海尔电视正在播放中...");
26     }
27 }
28 // 电视接口
29 public interface TV {
30     public void display();
31 }
32 
33 // 其中,HisenseTV,HaierTV都需要起实现TV这个接口,最终我们都是通过工厂类来实现手机的生产,
34 // 然而工厂又是通过客户传给工厂的电视品牌名来实现定制生产电视机;
35 // 工厂类
36 public class TVFactory {
37     public static TV produceTV(String brand) throws Exception {
38         if (brand.equalsIgnoreCase("Haier")) {
39             System.out.println("电视机工厂生产海尔电视机!");
40             return new HaierTV();
41         } else if (brand.equalsIgnoreCase("Hisense")) {
42             System.out.println("电视机工厂生产海信电视机!");
43             return new HisenseTV();
44         } else {
45             throw new Exception("对不起,暂不能生产该品牌电视机!");
46         }
47     }
48 }
49 在上面测试类当中,我们除了可以直接传入电视的品牌名让工厂生产相应的产品,但是在实际编程过程中,客户的需求
50 是不段变化的,所以我们可以通过xml文件来专门保存客户端需求,当客户需求变更的时候,我们只需要修改xml配置文
51 件,而不用去修改我们的源代码,所以上面测试类当中通过xml读取电视品牌名有个单独的方法,所以我们还需要创建
52 一个工具类用来读取数据:
53 // 工具类
54 public class XMLUtilTV {
55     public static String getBrandName() {
56         try {
57             DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
58             DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
59             Document doc = documentBuilder.parse(new File("res/SimpleFactoryTVNameConfig.xml"));
60             NodeList node = doc.getElementsByTagName("brandName");
61             Node firstChild = node.item(0).getFirstChild();
62             String brandName = firstChild.getNodeValue().trim();
63             return brandName;
64         } catch (Exception e) {
65             e.printStackTrace();
66             return null;
67         }
68     }

 

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