Builder Design

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>

你可能感兴趣的:(builder)