導入:
複雑なオブジェクトの構築と表現を分離して、同じ構築プロセスで異なる表現を作成できるようにします。オブジェクトを作成する最適な方法を提供します。Builder クラスは、最終オブジェクトを段階的に構築します。Builder クラスは他のオブジェクトから独立しています。その目的は、複雑なビルドをその表現から分離して、同じビルド プロセスで異なる表現を作成できるようにすることです。
ビルダー パターンの中心的な考え方は、複雑なオブジェクトの構築をその表現から分離することで、ユーザーは構築する必要があるオブジェクトのプロパティのみに集中する必要があります。このように、ユーザーはオブジェクトの内部実装の詳細を知る必要はなく、Builder が提供するインターフェイス メソッドを通じてオブジェクトのプロパティを設定するだけで、完全なオブジェクトを取得できます。
ビルダー
モードには
次の役割が含まれます。
- 抽象ビルダー クラス ( Builder ): このインターフェイスは、複雑なオブジェクトのこれらの部分の作成を指定します。特定のコンポーネント オブジェクトの作成は含まれません。
- コンクリート ビルダー クラス ( ConcreteBuilder ): Builderインターフェイスを実装し、複雑な製品の各コンポーネントの特定の作成メソッドを完了します。構築プロセスが完了したら、製品のインスタンスを提供します。
- 製品クラス ( Product ): 作成される複合オブジェクト。
- Director クラス ( Director ): 特定のビルダーを呼び出して、複雑なオブジェクトのさまざまな部分を作成します。director は、特定の製品オブジェクトのすべての部分が完全に、または特定の順序で作成されることを保証することのみを担当します。
コードデモ
コードを使用して、ビルダー メソッドを使用して自転車を作成する方法を示します。
まず、Bike クラスを作成して、自転車にバスケット、ラック、シート バッグの 3 つの属性を提供します。
public class Bike
{
public string basket { get; set; }
public string frame { get; set; }
public string seat { get; set; }
}
抽象ビルダークラス ( Builder )
ここでは自転車がインスタンス化されており、バスケット、ラック、シート バッグをそれぞれ構築するための 3 つの抽象メソッドがあります。ビルダーは特定のビルダーを呼び出して作成するため、特定のビジネスの実装クラスでメソッドをオーバーライドします。
public abstract class Builder
{
protected Bike mBike = new Bike();
public abstract void buildBasket();
public abstract void buildFrame();
public abstract void buildSeat();
public Bike createBike()
{
return mBike;
}
}
コンクリート ビルダー クラス (ConcreteBuilder)
ここでは、異なる自転車を作成する 2 つの実装クラスが記述されています。
//山地自行车
public class MountainBuilder : Builder
{
public override void buildBasket()
{
mBike.basket = "蓝色车篮";
}
public override void buildFrame()
{
mBike.frame = "铝合金车架";
}
public override void buildSeat()
{
mBike.seat = "橡胶车座";
}
}
//公路自行车
public class RoadBuilder : Builder
{
public override void buildBasket()
{
mBike.basket = "黑色车篮";
}
public override void buildFrame()
{
mBike.frame = "碳纤维车架";
}
public override void buildSeat()
{
mBike.seat = "海绵车座";
}
}
ディレクタークラス (ディレクター)
オブジェクトのすべての部分が完全に、または特定の順序で作成されることを保証します。ここで、ビルド メソッドは、渡されたビルダー実装クラスに基づいて順番に呼び出されます。
public class Director
{
private Builder _builder;
public Director(Builder builder)
{
_builder = builder;
}
public Bike construct()
{
_builder.buildBasket();
_builder.buildFrame();
_builder.buildSeat();
return _builder.createBike();
}
}
テストを受けてください
パラメータに道路車両インスタンスを含む Director インスタンスを作成し、その構築メソッドを呼び出して道路車両を取得します。
public static void Main(string[] args)
{
var director = new Director(new RoadBuilder());
Bike bike = director.construct();
Console.WriteLine($"车篮:{bike.basket}; 车架:{bike.frame}; 车座:{bike.seat}");
}
マウンテン バイクに変更する場合は、パラメータをマウンテン バイクのインスタンスに変更するだけです。
var ディレクター = 新しいディレクター(新しい MountainBuilder());
このビルダー モードを使用して作成されたすべての自転車で自転車を削除する必要があるという要件がある場合、Director クラスの対応するバスケット作成メソッドを削除するだけで済みます。
現時点では、コマンダーのコンストラクトを呼び出すことによって作成されたすべての自転車インスタンスにはバスケットがありません。
要約:
アドバンテージ:
- ビルダー パターンは非常にカプセル化されています。ビルダー パターンを使用すると、変更を効果的にカプセル化できます。ビルダー パターンを使用するシナリオでは、一般的な製品クラスとビルダー クラスは比較的安定しています。したがって、コマンダー クラスで主要なビジネス ロジックをカプセル化すると、全体的な結果が得られます。安定性が向上します。
- ビルダー パターンでは、クライアントは製品の内部構成の詳細を知る必要がなく、製品自体が製品作成プロセスから切り離されているため、同じ作成プロセスで異なる製品オブジェクトを作成できます。製品作成プロセスをより詳細に制御できます。複雑な製品の作成手順をさまざまな方法に分割すると、作成プロセスが明確になり、プログラムを使用して作成プロセスを制御しやすくなります。
- ビルダー パターンは簡単に拡張できます。新たな要件が発生した場合は、新たなビルダークラスを実装することで対応可能であり、基本的には以前にテストしたコードを修正する必要がないため、本来の機能を損なうことはありません。開閉の原則に従ってください。
欠点:
- ビルダーモードで作成される製品は一般的に共通点が多く、構成要素も類似していますが、製品間の差異が大きい場合にはビルダーモードは適さないため、使用範囲には一定の制限があります。
使用するシーン:
- 作成されたオブジェクトはより複雑で複数のパーツから構成されており、各パーツは複雑な変化に直面していますが、コンポーネント間の構築順序は安定しています。
- 複雑なオブジェクトの作成に使用されるアルゴリズムは、オブジェクトの構成部品やその組み立て方法とは独立しています。つまり、製品の構築プロセスと最終的な表現独立しています。