2013-04-23 66 views
0

中的構造函數定義輸入參數首先,我知道無法在Java中的接口中定義構造函數。但不知何故,我遇到了一個需要非常相似的問題。也許有我的情況下,簡單的解決方案...需要一種方法來爲接口

我有一個接口:

public interface SomeObject { 

    /** 
    * Generate a xml representation of the object. 
    */ 
    public String generateXMLRepresentation(); 

} 

對象的這個XML,表示將在某個地方,後來保存在它應該有可能建立一個副本使用這個xml表示的對象。我的初衷是定義一個構造函數,它將一個String作爲輸入,並讓每個SomeObject的實現知道如何處理它以及如何構造相應的對象。

我該如何做到這一點?

編輯︰要麼我不是很清楚,或者我認爲這是錯誤的方式,但我認爲工廠或生成器模式將無法正常工作。我需要更強大的地方,每個人都可以編寫一個新的SomeObject實現,並強制實現一個帶有xml字符串的構造函數。換句話說,我不知道SomeObject存在多少個或哪些實現存在,而是依賴於每個實現都知道如何從xml表示中構建自己。

+0

你怎麼能實現什麼? – acdcjunior 2013-04-23 16:25:33

+0

工廠設計模式? – jlordo 2013-04-23 16:27:21

+0

試圖通過任何方式強加一個String構造函數似乎是限制性的(Factory和Builder模式是鼓勵實現者執行此操作的可能方式)。看起來你所關心的是XML表示可以作爲一個String來生成。那麼你關心接口的實現是如何構建的呢? – 2013-04-23 16:58:45

回答

0

我相信你應該使用Factory pattern,因爲我們正在討論基於字符串建立一個對象。

所以你應該有不同的靜態方法爲給定的String構造不同的實現。

public class ObjV1 implements SomeObject(){ // objects would simply extend interface 
    ... 
} 

public class SomeObjectFactory{// factory would provide construction methods for different implementations of the interface 

    //Hide factory constructor, so we use it only as a singleton 
    private SomeObjectFactory(){ 
    } 

    public static ObjV1 buildV1(String str){ 
     ObjV1 obj = new ObjV1(); // note that we're using the noarg constructor 
     ... 
     return obj; 
    } 
} 

如果你想擁有在建設過程中更多的控制,你應該給Builder pattern一試

0

一些設計模式可以幫助您定義,可以處理你的當前環境的解決方案。 Abstract FactoryBuilder模式都可以幫到你。

我寧願用Builder的設計模式。通過實現正確的邏輯,您將最終能夠從簡單到複雜的對象構建完全基於您所擁有的XML表示。

0

我認爲你應該考慮將xml序列化的問題與你的對象處理的任何問題分開。來自xml的知識是否真的來源於你的類的內在領域,還是它是一個正交關係?

看一看http://x-stream.github.io/

如果你不想使用XSTREAM本身,因爲你可以不依賴於罐子,或者你的XML格式是特別到您的項目,至少看看做什麼的XStream 。你應該能夠定義一個策略來(反思性地)遞歸一個對象結構,並以你需要的形式寫出xml,然後用一個伴隨類來做相反的事情。

相關問題