2

ビルダーパターンについていくつか質問があることは知っています。
-サブクラスのコンストラクターからビルダー パターンを
使用する -いつビルダー パターンを使用する か -特定のクラスでビルダー パターンを改善する Java
-ビルダー デザイン パターン なぜディレクタが必要なのか

これまでのところ、ブロッホ アイテム 2 で説明されているようなビルダー パターンを使用しました。

昨日、細かいところを変えました。デフォルト値のパブリック コンストラクターを追加しました。したがって、必要な値を持つ複雑なオブジェクトのビルダーまたは単純なオブジェクトのコンストラクターの両方を使用できます。

public class Blub {
  private final String id;
  public Blub( final String id ) {
    this( Blub.Builder(id) );
  }

  private Blub( Builder builder ) {
    this.id = builder.id; 
  }

  public static class Builder {
    private final String id;
    public Builder( final String id ) {
      this.id = id;
    }

    public Blub build() {
      return new Blub(this);
    }      
  }
}

しかし、これに設計上の欠陥があるかどうかはわかりません。クラスを完成させれば、不利な点はないと確信しているからです。したがって、簡単なケースでは、Blob コンストラクターを呼び出すことができます。

new Blub("1a");

それ以外の

(new Blub.Builder("1a")).build();

しかし、クラスをファイナライズしないと、クラスを拡張して、新しいコンストラクターであらゆる種類のことを行うことができます。そして、これを台無しにするケースがないかどうかはわかりません。何か案が?

4

2 に答える 2

1

Builder (または Factory パターン) を使用する場合、通常、パラメーター化されたコンストラクターも使用するのは直観に反します (それらが依存関係にあり、IoC を使用している場合を除きます)。あなたは本質的に直交性とDRYの原則を破っています。Builder および Factory パターンは、通常、インスタンスの作成が重要な場合やエラーが発生しやすい場合に、構築上の課題を解決するために使用されます。

あなたの場合、これはそうではないようです。

それは設計上の欠陥ですか?いいえ。API が混乱する可能性はありますか? 絶対。特に時間の経過とともに、より多くのコードが分岐し、メソッド A と B のいずれかを使用するようになるためです。オブジェクトの作成にメソッド A を使用する必要がある場合と、メソッド B を使用する必要がある場合を新しい開発者に説明しますか?

于 2014-02-03T11:32:27.247 に答える
0

私がよく行うことの 1 つは、ビルダーと静的ファクトリ メソッドを提供して、一般的な単純なケースを構築することです。このようにして、プライベート コンストラクターを保持し、デフォルトのケースを構築する明確な方法を明らかにする意図を得ることができます。

Blub blub = Blub.createWithId("id");

これにより、複数のコンストラクターや紛らわしいパラメーターを持つコンストラクターを使用することなく、いくつかの静的ファクトリ メソッドを追加することもできます。

于 2013-08-25T00:44:12.030 に答える