2010-09-15 47 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