zoukankan      html  css  js  c++  java
  • 工厂三兄弟之抽象工厂模式(四)

    4 完整解决方案

           Sunny公司开发人员使用抽象工厂模式来重构界面皮肤库的设计,其基本结构如图6所示:

    6 界面皮肤库结构图

           在图6中,SkinFactory接口充当抽象工厂,其子类SpringSkinFactorySummerSkinFactory充当具体工厂,接口ButtonTextFieldComboBox充当抽象产品,其子类SpringButtonSpringTextFieldSpringComboBoxSummerButtonSummerTextFieldSummerComboBox充当具体产品。完整代码如下所示:

    1. //在本实例中我们对代码进行了大量简化,实际使用时,界面组件的初始化代码较为复杂,还需要使用JDK中一些已有类,为了突出核心代码,在此只提供框架代码和演示输出。  
    2. //按钮接口:抽象产品  
    3. interface Button  
    4.     public void display();  
    5.  
    6.   
    7. //Spring按钮类:具体产品  
    8. class SpringButton implements Button  
    9.     public void display()  
    10.         System.out.println("显示浅绿色按钮。");  
    11.      
    12.  
    13.   
    14. //Summer按钮类:具体产品  
    15. class SummerButton implements Button  
    16.     public void display()  
    17.         System.out.println("显示浅蓝色按钮。");  
    18.         
    19.  
    20.   
    21. //文本框接口:抽象产品  
    22. interface TextField  
    23.     public void display();  
    24.  
    25.   
    26. //Spring文本框类:具体产品  
    27. class SpringTextField implements TextField  
    28.     public void display()  
    29.         System.out.println("显示绿色边框文本框。");  
    30.      
    31.  
    32.   
    33. //Summer文本框类:具体产品  
    34. class SummerTextField implements TextField  
    35.     public void display()  
    36.         System.out.println("显示蓝色边框文本框。");  
    37.         
    38.  
    39.   
    40. //组合框接口:抽象产品  
    41. interface ComboBox  
    42.     public void display();  
    43.  
    44.   
    45. //Spring组合框类:具体产品  
    46. class SpringComboBox implements ComboBox  
    47.     public void display()  
    48.         System.out.println("显示绿色边框组合框。");  
    49.      
    50.  
    51.   
    52. //Summer组合框类:具体产品  
    53. class SummerComboBox implements ComboBox  
    54.     public void display()  
    55.         System.out.println("显示蓝色边框组合框。");  
    56.         
    57.  
    58.   
    59. //界面皮肤工厂接口:抽象工厂  
    60. interface SkinFactory  
    61.     public Button createButton();  
    62.     public TextField createTextField();  
    63.     public ComboBox createComboBox();  
    64.  
    65.   
    66. //Spring皮肤工厂:具体工厂  
    67. class SpringSkinFactory implements SkinFactory  
    68.     public Button createButton()  
    69.         return new SpringButton();  
    70.      
    71.   
    72.     public TextField createTextField()  
    73.         return new SpringTextField();  
    74.      
    75.   
    76.     public ComboBox createComboBox()  
    77.         return new SpringComboBox();  
    78.      
    79.  
    80.   
    81. //Summer皮肤工厂:具体工厂  
    82. class SummerSkinFactory implements SkinFactory  
    83.     public Button createButton()  
    84.         return new SummerButton();  
    85.      
    86.   
    87.     public TextField createTextField()  
    88.         return new SummerTextField();  
    89.      
    90.   
    91.     public ComboBox createComboBox()  
    92.         return new SummerComboBox();  
    93.      
    94.  

           为了让系统具备良好的灵活性和可扩展性,我们引入了工具类XMLUtil和配置文件,其中,XMLUtil类的代码如下所示:

    1. import javax.xml.parsers.*;  
    2. import org.w3c.dom.*;  
    3. import org.xml.sax.SAXException;  
    4. import java.io.*;  
    5.   
    6. public class XMLUtil  
    7. //该方法用于从XML配置文件中提取具体类类名,并返回一个实例对象  
    8.     public static Object getBean()  
    9.         try  
    10.             //创建文档对象  
    11.             DocumentBuilderFactory dFactory DocumentBuilderFactory.newInstance();  
    12.             DocumentBuilder builder dFactory.newDocumentBuilder();  
    13.             Document doc;                             
    14.             doc builder.parse(new File("config.xml"));   
    15.           
    16.             //获取包含类名的文本节点  
    17.             NodeList nl doc.getElementsByTagName_r("className");  
    18.             Node classNode=nl.item(0).getFirstChild();  
    19.             String cName=classNode.getNodeValue();  
    20.               
    21.             //通过类名生成实例对象并将其返回  
    22.             Class c=Class.forName(cName);  
    23.             Object obj=c.newInstance();  
    24.             return obj;  
    25.             
    26.         catch(Exception e)  
    27.             e.printStackTrace();  
    28.             return null 
    29.          
    30.      
    31.  

           配置文件config.xml中存储了具体工厂类的类名,代码如下所示:

  • 相关阅读:
    模拟按键'ESC',解决韩语等输入法对输入框(codemirror)的支持
    grpc的基础知识
    HttpClientFactory 是 HttpClient 的正确使用方式
    Workflow Core + asp.net core 5.0 实现简单审批工作流
    GitHub自动化部署(CD) asp.net core 5.0 项目(免费空间)
    CleanArchitecture Application代码生成插件-让程序员告别CURD Ctrl+C Ctrl+V
    C# 字符串转成JSON对象 反射获取属性值
    java设计模式-状态模式
    2021目前可用的百度网盘不限速下载方法
    docker映射配置文件
  • 原文地址:https://www.cnblogs.com/luckForever/p/7254910.html
Copyright © 2011-2022 走看看