4

Joshuaのビルダーパターンに基づいてビルダーを構築しています。私の質問は、どうすればシングルトンにすることができますか?私が以下のビルダーを持っている場合、私のポイントを詳しく説明します

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. ...
}

new Widget.Builder()。name( "abc")。build().......のような別のクラスからこのビルダーを呼び出します。

ただし、このウィジェットのインスタンスを1つだけ必要とする場合、または毎回新しいウィジェットを作成することなく、複数の場所からこのウィジェットにアクセスする必要がある場合はどうなりますか。理想的には、インスタンス化をWidgetクラスに限定したいと思います。何かご意見は?

4

4 に答える 4

7

IMHO、Singleton、および Builder パターンは一緒に機能しないようです。ビルドするインスタンスが 1 つしかないのに、なぜビルダーが必要なのですか?

同様のオブジェクトを数回ビルドしたいために Builder オブジェクトを再利用する必要がある場合は、単純にその Builder への参照を保持し、必要な回数だけ使用できます (静的にしたため)。

Widget.Builder builder = new Widget.Builder("abc").model("def");

次に、いくつかのウィジェットを作成できます。

Widget w1 = builder.build();
Widget w2 = builder.build();
...
于 2012-08-01T21:41:04.670 に答える
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().
于 2012-10-10T16:06:13.443 に答える
1

シングルトンが本当に必要な場合、 Joshuaは最新の Java でシングルトンを作成するための最良の方法についてのアドバイスも提供しています。

于 2012-08-01T22:04:16.580 に答える
0

ビルダー オブジェクトが 1 つしかない場合は、次のようなシングルトン パターンを使用できます。

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. ...
}

複数のビルダーがある場合は、このクラスに静的マップが必要になる場合があります

于 2012-08-01T21:56:53.640 に答える