我正在建立一个基于约书亚建设者模式的建设者。我的问题是如何让它成为单身人士? 详细阐述我的观点,如果我有以下建设者
public class Widget {
public static class Builder {
private String name;
public Builder( String name) {
this.name = name;
}
public Widget build() {
Widget result = new Widget(this);
return result;
}
public Builder model( String value ) {
this.model = value;
return this;
}
}
private final String name;
private Widget( Builder b ) {
this.name = b.name;
}
// ... etc. ...
}
我会从另一个类中调用此构建器 新的Widget.Builder()。name(“abc”)。build()........
但是如果我只想要这个Widget的一个实例,或者我需要从多个地方访问这个Widget而不需要每次都创建一个新的Widget。理想情况下,我想将实例化限制在Widget类中。有什么想法吗?
答案 0 :(得分:7)
恕我直言,Singleton和Builder模式似乎没有结合在一起:如果只有一个实例可以构建,为什么还需要一个构建器?
如果你需要重用一个Builder对象,因为你想多次构建一个类似的对象,你可以简单地保持对该Builder的引用,并根据需要多次使用它(因为你将它设置为静态):
Widget.Builder builder = new Widget.Builder("abc").model("def");
然后你可以创建几个小部件:
Widget w1 = builder.build();
Widget w2 = builder.build();
...
答案 1 :(得分:1)
如果你真的需要一个单身人士,约书亚也会就the best way to make a singleton in modern Java提出建议。
答案 2 :(得分:1)
如果您需要执行此操作,并且希望避免污染构建器模式,请添加单例以保存构建器的集中式实例。
public enum CentralWidgitBuilder{
INSTANCE; //Effective Java singleton technique
private final Widget.Builder mBuilder = new Widget.Builder();
public Widget.Builder getBuilder(){
return mBuilder;
}
}
然后从任何地方引用:
CentralWidgitBuilder.INSTANCE.getBuilder().
答案 3 :(得分:0)
如果只有一个构建器对象,那么您可以像这样使用单例模式:
public class Widget {
public static class Builder {
private static Builder builder;
private String name;
public Builder getInstance(String name){
if (instance==null){
instance=new Builder(name);
}
return instance;
}
private Builder( String name) {
this.name = name;
}
public Widget build() {
Widget result = new Widget(this);
return result;
}
public Builder model( String value ) {
this.model = value;
return this;
}
}
private final String name;
private Widget( Builder b ) {
this.name = b.name;
}
// ... etc. ...
}
如果您有多个构建器,则可能需要在此类中使用静态Map