单身人士和建造者(约书亚的方式)

时间:2012-08-01 21:34:45

标签: java builder

我正在建立一个基于约书亚建设者模式的建设者。我的问题是如何让它成为单身人士? 详细阐述我的观点,如果我有以下建设者

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类中。有什么想法吗?

4 个答案:

答案 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