工厂三兄弟之抽象工厂模式(四)

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中存储了具体工厂类的类名,代码如下所示:

原文地址:https://www.cnblogs.com/luckForever/p/7254910.html