2013-04-23 64 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,然后用一个伴随类来做相反的事情。

相关问题