熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

設計模式(1)Factory模式和Abstract Factory模式

2013-11-12 23:37:50  來源: Java高級技術 

    Factory模式
     利用給Factory對象傳遞不同的參數以返回具有相同基類或實現了同一接口的對象
    Abstract Factory模式
     先利用Factory模式返回Factory對象在通過Factory對象返回不同的對象!
   
    Java中的例子JAXP  
      以下是用Simple API for XML(SAX) Parse XML文件的片段
       
     
      String uri = file: + new File (xmlfilename)getAbsolutePath ();
      Parser parser;
      // Abstract Factory模式
      SAXParserFactory spf = SAXParserFactorynewInstance ();   
      String validation = SystemgetProperty (
   javaxxmlparsersvalidation false);
      if (validationequalsIgnoreCase(true))
       spfsetValidating (true);
  
      // Factory模式
      SAXParser sp = spfnewSAXParser ();   
      parser = spgetParser ();
      parsersetDocumentHandler (this);     
      parserparse (uri);
     
     
      SAXParserFactory中的靜態方法newInstance()根據系統屬性javaxxmlparsersSAXParserFactory不同的值
      生成不同的SAXParserFactory對象spf然後SAXParserFactory對象又利用方法newSAXParser()生成SAXParser對象
      注意
      SAXParserFactory 的定義為
      public abstract class SAXParserFactory extends javalangObject
      SAXParserFactoryImpl 的定義為
      public class SAXParserFactoryImpl extends javaxxmlparsersSAXParserFactory
     
      public static SAXParserFactory newInstance() {
     String factoryImplName = null;
      try {
       factoryImplName =
        SystemgetProperty(javaxxmlparsersSAXParserFactory
                comsunxmlparserSAXParserFactoryImpl);
     }catch (SecurityException se) {
       factoryImplName = comsunxmlparserSAXParserFactoryImpl;
     }
      SAXParserFactory factoryImpl;
      try {
       Class clazz = ClassforName(factoryImplName);
       factoryImpl = (SAXParserFactory)clazznewInstance();
      }catch (ClassNotFoundException cnfe) {
       throw new FactoryConfigurationError(cnfe);
     } catch (IllegalAccessException iae) {
       throw new FactoryConfigurationError(iae);
     } catch (InstantiationException ie) {
       throw new FactoryConfigurationError(ie);
     }
      return factoryImpl;
      }
     
      newSAXParser()方法在SAXParserFactory定義為抽象方法
      SAXParserFactoryImpl繼承了SAXParserFactory它實現了方法newSAXParser()
     
      public SAXParser newSAXParser() throws SAXException
     ParserConfigurationException
      {
        SAXParserImpl saxParserImpl = new SAXParserImpl (this);
        return saxParserImpl;
      }
     
      注意
       SAXParserImpl的定義為
       public class SAXParserImpl extends javaxxmlparsersSAXParser
       SAXParserImpl的構造函數定義為
       SAXParserImpl (SAXParserFactory spf) throws SAXException
   ParserConfigurationException
       {
        super();
       thisspf = spf;
       if (spfisValidating ()) {
        parser = new ValidatingParser();
        validating = true;
        }
       else {
        parser = new Parser();
        }
  
       if (spfisNamespaceAware ()) {
        namespaceAware = true;
        throw new ParserConfigurationException
   (Namespace not supported by SAXParser);
       }
       } 
       
      本例子中用到的class和interface的類關系圖如下
  

From:http://tw.wingwit.com/Article/program/Java/gj/201311/11158.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.