빌더 패턴 정의:
동일한 구성 프로세스가 다른 표현을 생성할 수 있도록 복잡한 객체의 구성과 표현을 분리합니다. 이 디자인 패턴을 빌더 패턴이라고 합니다.
빌더 패턴 구조 다이어그램:
빌더 패턴 역할:
1 빌더: 제품 객체 생성 각 구성 요소는 추상 인터페이스를 지정합니다.
2 ConcreteBuilder: 제품의 다양한 구성 요소를 구성 및 조립하고 생성된 표현을 정의 및 명확하게 하며 제품 검색을 위한 인터페이스를 제공하기 위해 Builder 인터페이스를 구현합니다.
3 감독: 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 인터페이스를 상속받아 침실, 거실, 주방 세 개의 방만 포함하는 집을 만듭니다. . 그런 집.
/// <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(); }
빌더 모드 기본 사용 "단계별로 복잡한 개체를 구축"하는 것입니다. 여기서 "단계별"은 안정적인 알고리즘인 반면 복잡한 개체의 부분은 자주 변경됩니다.
추상 클래스는 특히 생성으로 인해 제품에 필요하지 않습니다. 객체의 알고리즘이 복잡하여 이 패턴을 사용하거나 제품 생성 과정에 이 패턴을 적용할 경우 최종 결과가 크게 달라질 수 있으며 추상적인 제품 클래스를 구체화할 가능성이 낮습니다.
기존 추상 팩토리 패턴은 "계열 객체"의 수요 변화를 해결하고, 빌더 패턴은 "객체 부분"의 수요 변화를 해결합니다.
빌더 패턴을 사용하면 제품의 내부 외관을 독립적으로 변경할 수 있습니다. 빌더 패턴을 사용하면 클라이언트가 제품의 내부 구성에 대한 세부 사항을 알 수 없습니다
각 빌더는 상대적으로 독립적이며 다른 빌더와 아무런 관련이 없습니다.
빌더 패턴은 생성해야 하는 제품 객체의 속성에 적합합니다. 빌더 패턴은 생성 순서를 강제할 수 있습니다. 생성해야 하는 제품 객체는 내부 구조가 복잡합니다.