zoukankan      html  css  js  c++  java
  • 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     }
  • 相关阅读:
    python 通过js控制滚动条拉取全文 通过psutil获取pid窗口句柄,通过win32gui使程序窗口前置 通过autopy实现右键菜单和另存为操作
    python模拟鼠标键盘操作 GhostMouse tinytask 调用外部脚本或程序 autopy右键另存为
    vue.js移动端app实战3:从一个购物车入门vuex
    vue 做登陆页面 ( 登陆成功后去掉注册和登陆按钮 显示用户名)
    vue中手机号,邮箱正则验证以及60s发送验证码
    从零开始徒手撸一个vue的toast弹窗组件
    vue 更改头像功能实现
    event.srcElement与event.target的区别
    vue中使用axios post上传头像/图片并实时显示到页面
    vue开发:移动端图片上传
  • 原文地址:https://www.cnblogs.com/fjie/p/13628456.html
Copyright © 2011-2022 走看看