앱을 개발하다 보면 복잡한 객체를 생성해야 하는 경우가 있습니다. 이럴 때 Builder 디자인 패턴을 사용하면 객체 생성 과정을 추상화하고 제어할 수 있습니다. 이 글에서는 이러한 상황에서 Builder 디자인 패턴을 어떻게 활용하는지 설명하겠습니다.
Builder 디자인 패턴이란?
Builder 디자인 패턴은 객체 생성 과정을 캡슐화하고, 복잡한 객체를 단계적으로 만들 수 있도록 하는 패턴입니다. 보통 생성할 객체의 속성들을 설정하는 메서드들을 제공하여, 사용자가 원하는 기능을 갖춘 객체를 만들 수 있도록 합니다.
Builder 디자인 패턴 예시
간단한 예시를 통해 Builder 디자인 패턴을 살펴보겠습니다. 스타일이 다양한 문서를 생성하는 프로그램을 만들 때, Builder 디자인 패턴을 사용하여 다양한 스타일의 문서를 생성할 수 있습니다.
먼저, 다음과 같이 Document 클래스가 있습니다.
class Document {
var title: String?
var body: String?
var style: String?
init(title: String?, body: String?, style: String?) {
self.title = title
self.body = body
self.style = style
}
}
그리고, DocumentBuilder 프로토콜과 여러 개의 DocumentBuilder 구현체를 만들어 Builder 디자인 패턴을 구현할 수 있습니다.
protocol DocumentBuilder {
func setTitle(_ title: String) -> Self
func setBody(_ body: String) -> Self
func setStyle(_ style: String) -> Self
func build() -> Document
}
class FancyDocumentBuilder: DocumentBuilder {
private var title: String?
private var body: String?
private var style: String?
func setTitle(_ title: String) -> Self {
self.title = "Fancy: " + title
return self
}
func setBody(_ body: String) -> Self {
self.body = "Fancy: " + body
return self
}
func setStyle(_ style: String) -> Self {
self.style = "Fancy: " + style
}
func build() -> Document {
return Document(title: title, body: body, style: style)
}
}
위의 코드에서 FancyDocumentBuilder
는 DocumentBuilder
프로토콜을 따르는데, 다양한 스타일의 문서를 생성할 수 있도록 각 속성을 설정하는 메서드들을 제공합니다.
이제, Builder를 사용하여 다른 스타일의 문서를 생성해보겠습니다.
let fancyDocument = FancyDocumentBuilder()
.setTitle("Hello, Builder Pattern")
.setBody("This is a fancy document.")
.setStyle("Fancy")
.build()
위의 코드에서 fancyDocument
는 FancyDocumentBuilder
를 사용하여 만들어진 문서입니다. 이처럼 Builder 디자인 패턴을 사용하면 객체 생성 과정을 더욱 유연하게 제어할 수 있습니다.
정리
Builder 디자인 패턴을 사용하면 복잡한 객체를 생성하는 과정을 캡슐화하고, 단계적으로 만들 수 있습니다. 이를 통해 코드의 유연성을 높일 수 있으며, 객체를 생성하는 과정을 추상화하여 사용자가 원하는 기능을 가진 객체를 만들 수 있습니다. Builder 디자인 패턴은 객체 생성에 관련된 복잡한 작업을 단순화하고, 가독성을 높이는데 도움이 됩니다.
참고 문헌:
- “Design Patterns: Elements of Reusable Object-Oriented Software” by Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides