我需要使用“A”构建“MyThingie”。 MyThingie 位于模型包中,当前模型中没有代码访问数据库。我的问题是我应该使用以下哪种模式?顶部还是底部?或者完全不同的东西。
package com.model;
public class MyThingie {
private String foo = "";
private String bar = "";
private X x = null;
private Y y = null;
private Z z = null;
public MyThingie() {
}
public MyThingie(A a, X x, Y y, Z z) {
this.foo = a.getFoo();
this.bar = a.getBar();
this.x = x;
this.y = y;
this.z = z;
}
public static MyThingie createFromDb(A a) {
X x = fetchXFromDB(a.getBlah());
Y y = fetchYFromDB(a.getFlah());
Z z = fetchZFromDb(a.getZlah());
return new MyThingie(a, x, y, z);
}
// getters and setters
}
// ----------- OR----------------
package com.model;
public class MyThingie {
private String foo = "";
private String bar = "";
private X x = null;
private Y y = null;
private Z z = null;
public MyThingie() {
}
// getters and setters
}
package com.builder;
public class MyThingieBuilder {
public MyThingieBuilder() {
}
public static MyThingie createFromDb(A a) {
MyThingie m = new MyThingie();
m.setFoo(a.getFoo());
m.setBar(a.getBar());
X x = fetchXFromDB(a.getBlah());
Y y = fetchYFromDB(a.getFlah());
Z z = fetchZFromDb(a.getZlah());
m.setX(x);
m.setY(y);
m.setZ(z);
return m;
}
}
最佳答案
两种解决方案都可以。但有一种“构建器”方法/模式您可能会觉得有用。
根据我发布的评论,我提供了一个将 Builder 作为内部类的示例
Widget x = new Widget.Builder("1", 1.0).
model("1").build();
Widget y = new Widget.Builder("2", 2.0).
model("2").manufacturer("222").
serialNumber("12345").build();
Widget z = new Widget.Builder("3", 4.0).
manufacturer("333").
serialNumber("54321").build();
该模式背后的基本思想是限制构造函数参数的数量并避免使用 setter 方法。参数过多的构造函数,尤其是可选参数,不仅丑陋而且难以使用。不同模式的多个构造函数令人困惑。 Setter 方法会增加困惑并强制对象可变。这是该模式的类骨架 -
public class Widget {
public static class Builder {
public Builder(String name, double price) { ... }
public Widget build() { ... }
public Builder manufacturer(String value) { ... }
public Builder serialNumber(String value) { ... }
public Builder model(String value) { ... }
}
private Widget(Builder builder) { ... }
}
关于Java 模式问题 - 模型中的构建器或数据库代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3780281/