我刚刚开始从Wiki学习和实现构建器模式。还有Effective Java的CH2。
这与JSPServlets有关,这可能有点复杂,但我只是想把它传给你们,看看如何正确地做到这一点。
让我们从一个场景开始,在这个场景中,你不能完全构建对象——有些信息没有给出。因此,很可能您必须将对象放入会话中,然后在稍后向会话对象添加变量。我将如何使用构建模式来实现这一点?
以下是的代码示例
public class Widget(){
public static class Builder(){
public Builder(String id) {...}
public Builder serialNumber (String val) {...}
public Builder area (String val) {...}
public Widget build() { return new Widget(this); }
}
private Widget(Builder builder){...}
}
JSP Servlet 1//只有ID信息
Widget w = new Widget().Builder(id).build();
HttpSession session = request.getSession();
session.setAttribute("widget", w);
JSP Servlet 2//现在我有了串行和区域
Widget.Builder w = (Widget.Builder) session.getAttribute("widget");
//** This is as far as I go **
w.serialNumber("something") // Now this works
.area("sideArea") //
.build() // < I know if I do this I will be creating another Object. Is there a way to use build pattern without creating redundant obj?
谢谢大家。。。
w.serialNumber("something") // Can not find symbol
因为serialNumber不是w对象的方法。你可能正在寻找的是方法链:
public class Widget {
... //assuming you have all the right fields here
public Widget setSerialNumber(String id) {
this.id = id;
return this;
}
public Widget setArea(String area) {
this.area = area;
return this;
}
public static class Builder(){
public Builder(String id) {...}
public Builder serialNumber (String val) {...}
public Builder area (String val) {...}
public Widget build() { return new Widget(this); }
}
private Widget(Builder builder){...}
}
然后你可以做这样的事情:
w.setSerialNumber(id).setArea(area);
当您想要构建一个新的Widget对象时,请使用Widget.Builder;当您想要更改一个现有的Widget物体时,则使用方法链接。