0

首先,我知道在 Java 的接口中定义构造函数是不可能的。但不知何故,我遇到了一个问题,我需要一些非常相似的东西。也许我的情况有一个简单的解决方案......

我有一个界面:

public interface SomeObject {

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

}

对象的这个 xml 表示将存储在某个地方,以后应该可以使用这个 xml 表示构造对象的副本。我最初的想法是定义一个以 String 作为输入的构造函数,并让 SomeObject 的每个实现都知道如何处理它以及如何构造相应的对象。

我怎样才能做到这一点?

编辑:要么我对此不够清楚,要么我想错了,但我认为工厂或生成器模式行不通。我需要更强大的东西,每个人都可以编写 SomeObject 的新实现,并被迫实现一个采用 xml 字符串的构造函数。换句话说,我不知道 SomeObject 存在多少或哪些实现,但我仍然依赖于每个实现都知道如何从 xml 表示中构造自己。

4

3 回答 3

0

一些设计模式可以帮助您定义可以处理当前上下文的解决方案。抽象工厂建造者模式都可以帮助你。

我宁愿选择 Builder 设计模式。通过实现适当的逻辑,您最终将能够仅基于您拥有的 XML 表示来构造从简单到复杂的对象。

于 2013-04-23T16:30:10.210 回答
0

我认为您应该考虑将 xml 序列化的关注点与您的对象正在处理的任何关注点分开。往返 xml 的知识真的是你的类领域固有的,还是一个正交的问题?

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

如果你不想使用 xstream 本身,因为你不能依赖 jar,或者你的 xml 表单是特定于你的项目的,至少看看 xstream 做了什么。您应该能够定义一个策略来(反思地?)递归一个对象结构并以您需要的形式写出 xml,以及一个伴随类来做相反的事情。

于 2013-04-23T16:30:23.453 回答
0

我相信为此您应该使用工厂模式,因为我们正在讨论基于字符串构建对象。

所以你应该有不同的静态方法为给定的字符串构造不同的实现。

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;
   }
}

如果您想更好地控制构建过程,您应该尝试构建器模式

于 2013-04-23T16:27:10.957 回答