package ycl.learn.effective.java.builder; public interface BuilderAPI<T> { public T build(); /** * this is the builder Implement to build Object * 1. we can use diferent thing to builder diference Object. * 2. we can use something to builder any Type of Object. * * @return */ public T build(T root); /** * we can use the given object to builder Object what you want. * 1. we can builder object use given object. * 2. we can use the given object to builder new object, * but the type is not change * @param a * @param b * @return */ public T build(T parent,T sub); }
package ycl.learn.effective.java.builder; import java.io.ByteArrayOutputStream; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.apache.xerces.jaxp.DocumentBuilderFactoryImpl; import org.w3c.dom.Document; import org.w3c.dom.Node; @SuppressWarnings("hiding") public class TreeBuilder<Element> implements BuilderAPI<Element> { private Document rootDoc = null; public Element build() { // TODO Auto-generated method stub return null; } @SuppressWarnings("unchecked") public Element build(Node doc,Element root) { return (Element) doc.appendChild((Node) root); } @SuppressWarnings("unchecked") public Element build(Element parent,Element sub) { return (Element) ((Node) parent).appendChild((Node) sub); } public String getXMLString(Document xmlDoc){ String xmlString = null; try{ if (xmlDoc != null) { TransformerFactory tf = TransformerFactory.newInstance(); Transformer t = tf.newTransformer(); t.setOutputProperty("encoding", "UTF-8");// ByteArrayOutputStream bos = new ByteArrayOutputStream(); t.transform(new DOMSource(xmlDoc), new StreamResult(bos)); xmlString = bos.toString(); bos.close(); } }catch(Exception e){ e.printStackTrace(); } return xmlString; } public Document document(){ if(rootDoc ==null){ try { DocumentBuilderFactoryImpl impl = new DocumentBuilderFactoryImpl(); rootDoc= impl.newDocumentBuilder().newDocument(); } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return rootDoc; } public Element build(Element root) { // TODO Auto-generated method stub return null; } }
package ycl.learn.effective.java.builder; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Text; public class BuilderTest { /** * @param args */ public static void main(String[] args) { TreeBuilder<Element> builder = new TreeBuilder<Element>(); Document doc = builder.document(); Element root = doc.createElement("root"); builder.build(doc,root); Element header = doc.createElement("header"); header.setAttribute("uri", "http://www.baidu.com"); builder.build(root, header); for(int i=0;i<10;i++){ Element data = doc.createElement("data"+i); Text text = doc.createTextNode("val"+i); data.appendChild(text); builder.build(header, data); } String result = builder.getXMLString(doc); System.out.println(result); } }
<?xml version="1.0" encoding="UTF-8"?><root><header uri="http://www.baidu.com"><data0>val0</data0><data1>val1</data1><data2>val2</data2><data3>val3</data3><data4>val4</data4><data5>val5</data5><data6>val6</data6><data7>val7</data7><data8>val8</data8><data9>val9</data9></header></root>