2010-09-15 48 views
2

我有一個困境,需要我一直在想,但仍然沒有想出如何有效地有效代碼(設計)它。代碼設計模式結構

我有得到3基於文本的格式返回對象數據:JSON,XML,ATOM。在JSON中,數據可以是JSON對象或JSON數組。 XML和ATOM是xml。

基於上述3種格式,我要創建的對象(假設A,B,C,d,E)。我想有一個Builder模式來產生這些對象的,所以我Interface Builder的是:

public interface Builder<T, E, A> { //Where E = Element, A is Element array, this is useful for JSON 
    public T create(E element); 
    public T[] create(A array); 
} 

public class ABuilder implements Builder<A, JSON, JSONArray> { 
    public A create(JSON json) {...} 
    public A[] create(JSONArray array) {...} 
} 

的問題是,我想創建一個動態的工廠/另類的設計,可以創建基於格式對象模式。 ...

即我想要一個功能,這樣,我可以做

public class Resource { 

    public A getA(String formatString) { 
     return new Something().createA(formatString); //or something better.... 
    } 
} 

你有沒有努力使這個問題成爲可能沒有更好的辦法?請記住,所有這些都基於3種可能的格式。目標是根據格式動態生成對象,而不必擔心格式結構。

回答

2

我不是100%肯定,我知道你需要什麼,而是來到了我的腦海裏第一個設計模式是Strategy

這個簡單而優雅的模式,可以實現對每個實施的具體策略時,擁有(xml,json,atom),並且您還擁有一個靈活的解決方案,可以在未來輕鬆擴展以支持新格式,而不會破壞任何現有的代碼(即開放 - 關閉原則)。

因此,您將有一個Factory method,它將提供一個「Build」/「Get」方法,該方法的輸入將是一個代表所需格式的枚舉(只是一個示例,您可以以任何方式實現)以及該工廠方法將使用策略來實際構建對象。這樣,客戶100%不知道對象是如何構建的,甚至不需要知道它是什麼格式。

祝你好運!

+0

我認爲同樣的事情。我試圖得到的是基於格式,例如的JSON策略,我可以潛在地獲得一個JSON陣列(其開始和以'['和']'分別或JSON對象,其開始和結束與'分別一個'{'和'}結束時)。 XML本質上可以有一個數組或一個對象(由元素名稱區分)。我認爲建築師對這種情況更好,但與戰略一起使用時不會是最佳的。你得到我的漂移? – 2010-09-15 21:11:09

+0

當您有一個複雜的構建對象的過程時,構建器模式很有用,有幾種不同的實現。既然你沒有描述你構建的對象的內部結構,我真的不知道它是否有用。我同意它也是一個有效的方向 - 你可以有具體的建造者爲對象的每個部分是知道如何處理JSON,XML等\ – Ami 2010-09-16 12:42:19

+0

無論您使用的策略或生成器最重要的事情是,你保持打開/關閉的原則,而且您的設計對於未來的變化非常靈活,並且也足夠封裝,以便外部組件在使用時不會受到影響。 – Ami 2010-09-16 12:43:12