ビルダー パターンの定義:
複雑なオブジェクトの構築をその表現から分離し、同じ構築プロセスで異なる表現を作成できるようにします。このような設計パターンはビルダー パターンと呼ばれます
ビルダー パターンの構造図:
。ビルダーパターンの役割:
1 ビルダー: 製品オブジェクトを作成する各コンポーネントの抽象インターフェイスを指定します。
2 ConcreteBuilder: Builder インターフェイスを実装して、製品のさまざまなコンポーネントを構築および組み立て、作成する表現を定義および明確にし、製品を取得するためのインターフェイスを提供します。
3 Director: Builder インターフェイスを使用してオブジェクトを構築します。
4 製品: 構築された複雑なオブジェクトを表します。 ConcreteBuilder は、製品の内部表現を作成し、そのアセンブリ プロセスを定義します。これには、コンポーネント パーツを定義するクラスや、それらのパーツを最終製品に組み立てるためのインターフェイスが含まれます。
以下は、ビルダー パターンを説明するために実際に家を建てる例です:
1. 実装する家のタイプ、作成後に返される部屋の数を作成するための条件を含むビルダー インターフェイスを抽象化します。 、およびこのアイテムの家の説明。
/// <summary> /// 抽象建造者 /// </summary> public interface IHouse { /// <summary> /// 创建房子种类的条件 /// </summary> /// <returns></returns> bool GetBackyard(); /// <summary> /// 创建的房间数 /// </summary> /// <returns></returns> long NoOfRooms(); /// <summary> /// 描述 /// </summary> /// <returns></returns> string Description(); }
2. 特定のビルダーである IHouse インターフェイスを継承し、リビング ルーム、キッチン、バスルーム、ベッドルームの合計 4 つの家のような部屋を作成します。
public class CRoom { public string RoomName { get; set; } } /// <summary> /// 具体建造者 /// </summary> public class CSFH:IHouse { private bool mblnBackyard; private Hashtable Rooms; public CSFH() { CRoom room = new CRoom(); room.RoomName = "一楼客厅"; Rooms = new Hashtable(); Rooms.Add("room1", room); room = new CRoom(); room.RoomName = "一楼厨房"; Rooms.Add("room2", room); room = new CRoom(); room.RoomName = "一楼洗手间"; Rooms.Add("room3", room); room = new CRoom(); room.RoomName = "一楼卧室"; Rooms.Add("room4",room); mblnBackyard = true; } public bool GetBackyard() { return mblnBackyard; } public long NoOfRooms() { return Rooms.Count; } public string Description() { IDictionaryEnumerator myEnumerator = Rooms.GetEnumerator(); string strDescription = "这个房子共 " + Rooms.Count + " 间 \n"; while (myEnumerator.MoveNext()) { strDescription = strDescription + "\n" + myEnumerator.Key + "\t" + ((CRoom)myEnumerator.Value).RoomName; } return strDescription; } }
3. IHouse インターフェースを継承し、特定の建築者がここに家を作成します。これには、寝室、リビングルーム、キッチンのみが含まれます。合計 3 つの部屋がある家。
/// <summary> /// 其他具体建造者 /// </summary> public class CApt:IHouse { private bool mblnBackyard; private Hashtable Rooms; public CApt() { Rooms = new Hashtable(); CRoom room = new CRoom(); room.RoomName = "卧室"; Rooms.Add("room1", room); room = new CRoom(); room.RoomName = "客厅"; Rooms.Add("room2", room); room = new CRoom(); room.RoomName = "厨房"; Rooms.Add("room3", room); mblnBackyard = false; } public bool GetBackyard() { return mblnBackyard; } public long NoOfRooms(){ return Rooms.Count; } public string Description(){ IDictionaryEnumerator myEnumerator = Rooms.GetEnumerator(); string strDescription = "这个房子一共 " + Rooms.Count + " 间 \n"; while (myEnumerator.MoveNext()) { strDescription = strDescription + "\n" + myEnumerator.Key + "\t" + ((CRoom)myEnumerator.Value).RoomName; } return strDescription; } }
4. どの建築業者がどのような部屋を建てるかをガイドするガイドを作成します。
/// <summary> /// 指导者 /// </summary> public class CDirector { public IHouse BuildHouse(bool blnBackyard) { if (blnBackyard) { return new CSFH(); } else { return new CApt(); } } }
5. 作成:
static void Main(string[] args) { CDirector objDirector = new CDirector();//实例化指导者 IHouse objHouse; string Input = Console.ReadLine();//输入条件指导哪位创建者创建房间 objHouse = objDirector.BuildHouse(bool.Parse(Input)); Console.WriteLine(objHouse.Description()); Console.ReadLine(); }
ビルダー パターンは主に「複雑なオブジェクトを段階的に構築する」ために使用されます。「段階的に」は安定したアルゴリズムであり、複雑なオブジェクト製品のさまざまな部分は頻繁に変更されます
特にオブジェクト作成アルゴリズムの複雑さのためにこのパターンが使用される場合、またはこのパターンが製品の生成プロセス、最終結果に適用される場合、製品は抽象クラスを必要としません。大きく異なる場合もあれば、大きく異なる場合もあります。抽象的な製品クラスを改良することは可能です。
前の抽象ファクトリーパターンは「シリーズオブジェクト」の需要変化を解決し、ビルダーパターンは「オブジェクトパーツ」の需要変化を解決します。
ビルダーパターンを使用すると、製品の内部外観を独立して変更できます。ビルダー パターンを使用すると、クライアントは製品の内部構成の詳細を知る必要がなくなります
各ビルダーは比較的独立しており、他のビルダーとは何の関係もありません。
ビルダー パターンは、生成する必要がある製品オブジェクトのプロパティに適しています。ビルダー パターンは、生成順序を強制できます。生成する必要がある製品オブジェクトは、複雑な内部構造を持っています。