빌더(Builder) 패턴
소프트웨어 디자인 패턴 중 하나로, 객체 생성 과정을 더 유연하게 만들고 복잡한 객체의 생성을 단순화하는 데 도움을 주는 패턴 중 하나.
고안된 이유
복잡한 객체 생성:
프로그램에서 객체를 생성하는 과정이 복잡할 때, 객체의 생성 및 초기화를 간편하게 만들기 위한 필요성이 높아짐.
복잡한 객체란 여러 속성이나 설정 옵션을 가진 객체를 의미하며, 이러한 객체를 생성하는 코드는 매우 복잡하고 가독성이 떨어질 수 있음.
생성자 매개변수의 길이:
객체를 생성할 때 많은 생성자 매개변수를 전달해야 하는 경우, 이를 구분하기 어렵고 코드의 가독성이 떨어짐.
특히 선택적으로 값을 설정해야 하는 경우 생성자 오버로딩이 복잡해질 수 있음.
변경 불가능한(Immutable) 객체:
변경 불가능한 객체를 생성할 때, 생성된 객체의 속성을 변경할 수 있는 방법이 없어야 함.
따라서 한 번 생성된 객체를 변경하지 않고 새로운 객체를 생성해야 함.
장점
객체 생성과 초기화 과정을 분리: 객체 생성 및 초기화 단계를 분리함으로써 객체 생성 과정을 더 유연하게 다룰 수 있음.
가독성 향상: 복잡한 객체를 생성할 때 빌더 패턴을 사용하면 가독성이 향상되며, 객체의 설정 옵션을 명확하게 분리할 수 있음.
선택적 속성 설정: 빌더 패턴을 사용하면 선택적으로 객체의 속성을 설정할 수 있으며, 불필요한 생성자 오버로딩을 피할 수 있음.
Person.cs 예시
using System; // Person 클래스를 정의합니다. public class Person { public string Name { get; set; } public int Age { get; set; } public string Address { get; set; } public void DisplayInfo() { Console.WriteLine($"Name: {Name}, Age: {Age}, Address: {Address}"); } } // PersonBuilder 클래스를 정의하여 빌더 패턴을 구현합니다. public class PersonBuilder { private Person person; public PersonBuilder() { person = new Person(); } public PersonBuilder SetName(string name) { person.Name = name; return this; } public PersonBuilder SetAge(int age) { person.Age = age; return this; } public PersonBuilder SetAddress(string address) { person.Address = address; return this; } public Person Build() { return person; } } class Program { static void Main() { // 빌더 패턴을 사용하여 Person 인스턴스를 생성합니다. Person person = new PersonBuilder() .SetName("John") .SetAge(30) .SetAddress("123 Main St") .Build(); // 생성된 Person 객체의 정보를 출력합니다. person.DisplayInfo(); } }
Person 클래스는 사람의 속성을 나타내며, PersonBuilder 클래스는 Person 객체를 생성하고 설정하는 역할을 합니다.
PersonBuilder 클래스는 각 속성을 설정하기 위한 메서드를 제공하고, 메서드 체이닝을 통해 객체의 속성을 설정한 후 Build 메서드를 호출하여 실제 객체를 반환합니다.