Factory模式和Abstract Factory模式 - 编程吧

上一篇 | 下一篇

Factory模式和Abstract Factory模式

发布: 2006-9-14 21:11 | 作者: 佚名 | 来源: 不详 | 查看: 119次

Factory模式

          利用给Factory对象传递不同的参数,以返回具有相同基类或实现了同一接口的对象。



Abstract Factory模式

      先利用Factory模式返回Factory对象,在通过Factory对象返回不同的对象!

       

       Java中的例子-----JAXP1.0.1 :   

           以下是用Simple API for XML(SAX) Parse XML文件的片段

           ...  

           

           String uri = "file:" + new File (xmlfilename).getAbsolutePath ();

           Parser parser;

            //1. Abstract Factory模式

           SAXParserFactory spf = SAXParserFactory.newInstance ();       

           String validation = System.getProperty (

        "javax.xml.parsers.validation", "false");

           if (validation.equalsIgnoreCase("true"))

         spf.setValidating (true);



           //2. Factory模式

           SAXParser sp = spf.newSAXParser ();       

           parser = sp.getParser ();

           parser.setDocumentHandler (this);           

           parser.parse (uri);

           ....

           

           1. SAXParserFactory中的静态方法newInstance()根据系统属性javax.xml.parsers.SAXParserFactory不同的值

           生成不同的SAXParserFactory对象spf。然后SAXParserFactory对象又利用方法newSAXParser()生成SAXParser对象。

           注意:

           SAXParserFactory 的定义为:

           public abstract class SAXParserFactory extends java.lang.Object

           SAXParserFactoryImpl 的定义为:

           public class SAXParserFactoryImpl extends javax.xml.parsers.SAXParserFactory

           

           public static SAXParserFactory newInstance() {

     String factoryImplName = null;

            try {

              factoryImplName =

                System.getProperty("javax.xml.parsers.SAXParserFactory", 

                               "com.sun.xml.parser.SAXParserFactoryImpl");

     }catch (SecurityException se) {

         factoryImplName = "com.sun.xml.parser.SAXParserFactoryImpl"; 

     }

            SAXParserFactory factoryImpl;

            try {

              Class clazz = Class.forName(factoryImplName);

              factoryImpl = (SAXParserFactory)clazz.newInstance();

            }catch  (ClassNotFoundException cnfe) {

        throw new FactoryConfigurationError(cnfe);

     } catch (IllegalAccessException iae) {

        throw new FactoryConfigurationError(iae);

     } catch (InstantiationException ie) {

        throw new FactoryConfigurationError(ie);

     }

            return factoryImpl;

           }

           

           2. newSAXParser()方法在SAXParserFactory定义为抽象方法,

           SAXParserFactoryImpl继承了SAXParserFactory,它实现了方法newSAXParser():

           

           public SAXParser newSAXParser() throws SAXException,

            ParserConfigurationException

           {

              SAXParserImpl saxParserImpl = new SAXParserImpl (this);

          return saxParserImpl;

           }

           

           注意:

              SAXParserImpl的定义为:

              public class SAXParserImpl extends javax.xml.parsers.SAXParser

              SAXParserImpl的构造函数定义为:

              SAXParserImpl (SAXParserFactory spf) throws SAXException,

          ParserConfigurationException 

              {

               super();

        this.spf = spf;

        if (spf.isValidating ()) {

          parser = new ValidatingParser();

          validating = true;

               }

        else {

          parser = new Parser();

               }



        if (spf.isNamespaceAware ()) {

          namespaceAware = true;

          throw new ParserConfigurationException 

   ("Namespace not supported by SAXParser");

        }

              }   

              

            本例子中用到的class和interface的类关系图如下



            
 

TAG: 编程

字号: | 推荐给好友

 

评分:0

我来说两句

seccode