设计一个可变复杂类及其在java中的构造

时间:2013-02-09 15:30:14

标签: java design-patterns builder

我正在设计一个复杂的Configuration类作为API设计的一部分。 Configuration类大致如下所示..(我忽略了泛型/访问修饰符等)

class Configuration {
    One obj1;
    Two obj2;
}

class One {
      List<Double> values;
}

class Two {
      double value;
      Map<String, Double> data;
}

这就是我想要完成的事情:

  • 我希望用户能够第一次轻松创建此Configuration类并提交给服务器。
  • 然后他们可以更改此类的任何部分并将更新的配置发送到服务器。

使用和避免哪些设计模式?

使这个类成为不可变并使用构建器模式更好吗? 或者只是在Configuration类上提供各种修改方法,这样他们就可以就地修改相同的Configuration类(在所有级别),而无需为每次更新创建新的Configuration类。我认为Builder模式仅适用于Immutable类。

问题:

  • 有没有办法在这种情况下利用Builder模式?
  • 或者如上所述在Configuration类上提供mutator方法更好吗?
  • 或者还有其他更好的模式吗?

1 个答案:

答案 0 :(得分:0)

我认为你应该使用原型模式: 在您的代码中,您可以添加包含所有类型配置的地图 地图将有一个名为“currentConfiguration”的键,值将是应加载的配置。地图还可以包含可以存储在地图中的其他配置,并且可以根据需要替换当前配置。 一旦从地图中获取配置,您只需克隆配置对象,用户就可以做任何他喜欢的事情。在更改之后,他可以使用speicifc名称将配置保存在地图中。因此,用户可以获得与他所需要的相近的配置对象并相应地进行配置。 代码应如下所示:`public class CloudRepository {

private Map<String, Configuration> rep;

public CloudRepository(Configuration current){
    rep = new HashMap<String, Configuration>();
    rep.put("current", current);
}

public Configuration getConfiguration(String string){
    return (Configuration) rep.get(string).clone();
}

public void addConfiguration(String name, Configuration conf){
    rep.put(name, conf);
}

public void replaceCurrentConfiguration(Configuration conf){
    rep.put("current", conf);
}

}

您还可以编写更多代码来处理配置的历史记录。 你也可以考虑制作这个班级单身人士