zoukankan      html  css  js  c++  java
  • 设计模式02-抽象工厂

    xml的解析有很多中 比如: Dom解析 Sax解析 等  在android中新增了一种很简单的解析方式 pull解析

    解析xml我个人把它分成两大类 

          1 : 从JavaBean到xml 

          2 : 从xml 到JavaBean

    由于抽象工厂的特点为: 提供一个创建一系列相关或相互依赖对象的接口,而没必要指定他们具体的类

    可以将上述两类抽象到一个类中 ,代码如下:

    interface XmlParseFactory{
        public BeanToXml getBeanToXml() ; //从JavaBean到xml 
        public XmlToBean getXmlToBean() ; //从xml到JavaBean
    }
        BeanToXml为实现从JavaBean到xml转换的对象由于这种转换有很多方式,XmlToBean是从Xml到JavaBean的转换
    可能是Dom解析、Sax解析、Pull解析 因此可以创建DomParseFactory,SaxParseFactory,PullParseFactory来返回具体的解析方式,例如 :DomParseFactory
    class DomParseFactory implements XmlParseFactory{
        public BeanToXml getBeanToXml() {
            return new DomBeanToXml();
        }
        public XmlToBean getXmlToBean() {
            return new DomXmlToBean();
        }
    }
        其中的DomBeanToXml表示的是Dom方式下从JavaBean到Xml的转换对象 该对象中应该包含一个具体的转换方法 (即从JavaBean到Xml在Dom解析下具体的代码实现);类推在Sax解析下应该也存在类似的对象SaxBeanToXml
    该对象为Sax下从JavaBean到Xml的具体代码实现 同理也存在一个PullBeanToXml 很明显我们可以为三者抽象一个接口来指定转换的方法 即可以实现一个BeanToXml的接口
    interface BeanToXml {
        public void Bean2Xml(String xmlPath) ; //xmlPath 表示xml的路径
    }
        那么DomBeanToXml为: 
    class DomBeanToXml implements BeanToXml{
        public void Bean2Xml(String xmlPath) {
            System.out.println("DomBeanToXml:具体实现");
        }
    }
        SaxBeanToXml:
    class SaxBeanToXml implements BeanToXml{
        public void Bean2Xml(String xmlPath) {
            System.out.println("SaxBeanToXml:具体实现");
        }
    }

    按照上面的分析可以得到应该也需要有一个XmlToBean:
    interface XmlToBean {
        public void XmlToBean(Object bean) ;
    }

    在客户端的实现就比较简单:
    public class AbstractFactoryDemo {
        public static void main(String[] args) {
               XmlParseFactory factory = new DomParseFactory() ;
               XmlToBean domXmlToBean =  factory.getXmlToBean() ;
               domXmlToBean.XmlToBean(null);
               
               factory = new SaxParseFactory() ;
               factory.getXmlToBean().XmlToBean(null) ;
               
        }
    }
    下面给出一个完整可允许的代码: 
    package org.lkl.patterns.abstractfactory;
    
    interface XmlParseFactory{
        public BeanToXml getBeanToXml() ;
        public XmlToBean getXmlToBean() ;
    }
    
    class DomParseFactory implements XmlParseFactory{
        public BeanToXml getBeanToXml() {
            return new DomBeanToXml();
        }
        public XmlToBean getXmlToBean() {
            return new DomXmlToBean();
        }
    }
    
    class SaxParseFactory implements XmlParseFactory{
        public BeanToXml getBeanToXml() {
            return new SaxBeanToXml();
        }
        public XmlToBean getXmlToBean() {
            return new SaxXmlToBean();
        }
        
    }
    
    
    interface BeanToXml {
        public void Bean2Xml(String xmlPath) ;
    }
    
    interface XmlToBean {
        public void XmlToBean(Object bean) ;
    }
    
    
    class DomXmlToBean implements XmlToBean{
        public void XmlToBean(Object bean) {
            System.out.println("DomXmlToBean:具体实现");
        }
         
    }
    
    class DomBeanToXml implements BeanToXml{
        public void Bean2Xml(String xmlPath) {
            System.out.println("DomBeanToXml:具体实现");
        }
    }
    
    
    class SaxXmlToBean implements XmlToBean{
        public void XmlToBean(Object bean) {
            System.out.println("SaxXmlToBean:具体实现");
        }
         
    }
    
    class SaxBeanToXml implements BeanToXml{
        public void Bean2Xml(String xmlPath) {
            System.out.println("SaxBeanToXml:具体实现");
        }
    }
    
    
    
    public class AbstractFactoryDemo {
        public static void main(String[] args) {
               XmlParseFactory factory = new DomParseFactory() ;
               XmlToBean domXmlToBean =  factory.getXmlToBean() ;
               domXmlToBean.XmlToBean(null);
               
               factory = new SaxParseFactory() ;
               factory.getXmlToBean().XmlToBean(null) ;
               
        }
    }
    完整代码

    上面的完整代码只给出了Dom和Sax的解析 当然通过以上方法要拓展一个Pull解析再简单不过了 达到了代码的底耦合



    以上为抽象工厂的模式准备好了Xml的解析方式,但是在实际的开发中按照实际的情况去选择一种特定的解析方式

    以Dom和Sax将Xml转换到JavaBean为例:
    DOM将文档载入到内存中处理,而SAX则相反,它可以检测一个即将到来的 XML流,由此并不需要所有的XML代码同时载入到内存中
    Dom特点:
        在处理DOM的时候,需要读入整个XML文档,然后在内存中创建DOM树,生成DOM树上的Node对象。当文档比较小的时候,是复杂对象处理的首选,但一旦文档大,处理DOM就会变得相当费时费力。特别是其对于内存的需求,也将是成倍的增长,以至于在某些应用中使用DOM是一件很不划算的事
      Sax特点:
    事件驱动(
    所谓事件驱动,是指一种基于回调(callback)机制的程序运行方法)的,并不需要读入整个文档,而文档的读入过程也就是SAX的解析过程
    通过以上特定可以做一个简单的例子来获取Xml的解析方式 (例子:当xml文件小于1KB的时候采用Dom解析 反之采用Sax解析)
        创建一个XmlParseFactoryBuilder类
    class XmlParseFactoryBuilder{
        
        public static XmlToBean createXmlToBean(String path){
            return XmlParseFactoryBuilder.createXmlParseFactory(path).getXmlToBean() ;
        }
        
        public static XmlParseFactory createXmlParseFactory(String path){
            if(fileSizeHandle(path)){
                return new DomParseFactory() ;
            }else {
                return new SaxParseFactory() ;
            }
        }
        //处理文件的大小 如果文件大于1KB 返回false 否则返回true
        private static  boolean fileSizeHandle(String path) {
            File file = new File(path) ;
            if(file.length()>1*1024){
                return false ;
            }else{
                return true ;
            }
        }
    }


  • 相关阅读:
    华为lab-rs-v1-2.11_OSPF与ISIS互通
    jdk源码分析红黑树——插入篇
    jdk源码分析PriorityQueue
    jdk源码分析ArrayDeque
    jdk链表笔记
    jdk顺序表笔记
    SpringMVC类型转换器、属性编辑器
    SpringMVC基本使用
    spring整合hibernate
    spring aop注解配置
  • 原文地址:https://www.cnblogs.com/liaokailin/p/3615935.html
Copyright © 2011-2022 走看看