2012-11-30 69 views
4

我想實現從服務器獲取XML文檔的工廠模式。 (使用javax.xml.parsers.DocumentBuilder)獲取XML數據

我現在有下面的類,你能給你的意見嗎?這種模式的結構是否有意義? (我問在代碼審查的samequestion但是,如果還沒有任何反饋還)

DocumentGeneratorFactory(抽象工廠)

public interface DocumentGeneratorFactory { 

    public Document createDocument(String scheme, String authority, 
      String path, HashMap<String, String> parameters) 
      throws ParserConfigurationException, SAXException, IOException;  

} 

ProductDocumentGeneratorFactory(Concreate廠)

public class ProductDocumentGeneratorFactory implements 
     DocumentGeneratorFactory { 

    public Document createDocument(String scheme, String authority, 
      String path, HashMap<String, String> parameters) 
      throws ParserConfigurationException, SAXException, IOException { 

     Uri.Builder uri = new Uri.Builder(); 
     uri.scheme(scheme); 
     uri.authority(authority); 
     uri.path(path); 

     Set<Map.Entry<String, String>> set = parameters.entrySet(); 

     for (Map.Entry<String, String> params : set) { 
      uri.appendQueryParameter(params.getKey(), params.getValue()); 
     } 

     URL url = new URL(uri.toString()); 

     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 
     Document doc = db.parse(new InputSource(url.openStream())); 
     doc.getDocumentElement().normalize(); 

     return doc; 
    } 

} 

請求 (抽象產品)

public abstract class Request { 
    Document doc; 
    HashMap<String, String> queryStrings; 

    abstract void prepareRequest() throws ParserConfigurationException, SAXException, IOException; 

} 

ProductRequest(產品)

public class ProductRequest extends Request{ 
    ProductDocumentGeneratorFactory DocumentGeneratorFactory; 
    HashMap<String, String> queryStrings; 

    public ProductRequest(ProductDocumentGeneratorFactory DocumentGeneratorFactory,HashMap<String, String> queryStrings){ 

     this.DocumentGeneratorFactory = DocumentGeneratorFactory; 
     this.queryStrings = queryStrings; 
    } 

    @Override 
    void prepareRequest() throws ParserConfigurationException, SAXException, IOException { 
     doc = this.DocumentGeneratorFactory.createDocument("http", "ip-address", "default.aspx",this.queryStrings);  
    } 

} 
+0

在'ProductDocumentGeneratorFactory'中,我沒有看到特定於產品的任何事情。你能詳細說明你在那裏試着做什麼嗎? –

+0

會有不同的網址請求。例如,我將有一個產品,評論,用戶的XML數據...所以我認爲我應該有不同的文檔,並做到這一點。我創建了抽象的DocumentGeneratorFactory。 ProductDocumentGeneratorFactory使用querystrin hashmap創建特定文檔。 (也會有VODDocumentGeneratorFactory,CommentDocumentGeneratorFactory ...) – Talha

+0

然後ProductRequest產品將更便宜的獲得XMl操作的其他部分。例如,這個人會獲取數據並將其解析爲特定的對象。但我還沒有寫這部分。我只是想知道邏輯?或者你對這個結構的方法 – Talha

回答

0

這沒有什麼意義,因爲具體工廠必須返回,他們創建的對象,但使用的是內置的Java DocumentBuilder db = dbf.newDocumentBuilder();,所以這將返回相同的對象,無論什麼。

如果ProductDocumentGeneratorFactory以某種方式返回類型爲ProductDocument的對象,那麼這將是有意義的。

Example of Abstract Factory Pattern

所以你的情況我不`噸覺得這個模式是決策意識。

+0

你對這個實現工廠模式有什麼想法嗎? – Talha

+0

如果您將在JDK類'AbstractDOMParser'中挖掘,您會發現一個名爲'getDocument()'的方法,它本身就可以作爲所有不同類型文檔的工廠。所以從您的需求角度來看,這種模式並不適用。但是你能以某種方式分享全部需求嗎?如果我完全理解要求,我一定會想要幫助。 –

+0

好吧,你發給我空的信息到[email protected],我會回信給你 – Talha

0
public abstract class AbstractFactory 
{ 
    public abstract Product createProduct(); 
    public abstract Comment createComment(); 
    public abstract User createUser(); 

    public Document createDocument(String scheme, String authority, 
      String path, HashMap<String, String> parameters) 
      throws ParserConfigurationException, SAXException, IOException { 

//---------Your code ----- 

     return doc; 
    } 


} 

public class XMLFactory implements AbstractFactory 
{ 
     public Product createProduct() 
      { 
       /* use createDocument() */ 
      } 

     //Remaining Code for other stuff u want to create... 
} 

public interface Product{ 
//product 

} 

public class ProductImpl implements Product 
{ 
//implementation 

}