GO · 구조체/인터페이스
빌더 패턴
복잡한 객체를 단계적으로 구성하는 빌더 패턴. 메서드 체이닝으로 가독성을 높입니다.
구조체/인터페이스고급builderpatternchainingfluent
핵심 설명
복잡한 객체를 단계적으로 구성하는 빌더 패턴. 메서드 체이닝으로 가독성을 높입니다.
Go code
package main
import "fmt"
type Query struct {
table string
wheres []string
order string
limit int
}
type QueryBuilder struct {
q Query
}
func Select(table string) *QueryBuilder {
return &QueryBuilder{q: Query{table: table}}
}
func (b *QueryBuilder) Where(cond string) *QueryBuilder {
b.q.wheres = append(b.q.wheres, cond)
return b // 체이닝
}
func (b *QueryBuilder) OrderBy(col string) *QueryBuilder {
b.q.order = col
return b
}
func (b *QueryBuilder) Limit(n int) *QueryBuilder {
b.q.limit = n
return b
}
func (b *QueryBuilder) Build() string {
sql := "SELECT * FROM " + b.q.table
for i, w := range b.q.wheres {
if i == 0 { sql += " WHERE " } else { sql += " AND " }
sql += w
}
if b.q.order != "" { sql += " ORDER BY " + b.q.order }
if b.q.limit > 0 { sql += fmt.Sprintf(" LIMIT %d", b.q.limit) }
return sql
}
func main() {
sql := Select("users").
Where("age > 18").
Where("active = true").
OrderBy("name").
Limit(10).
Build()
fmt.Println(sql)
}학습 팁
빌더의 각 메서드가 *Builder를 반환하면 메서드 체이닝이 가능합니다. 마지막에 Build()로 최종 객체를 생성하세요.
주의할 점
빌더를 값 리시버로 구현하면 매 호출마다 복사되어 상태가 유지되지 않습니다. 포인터 리시버를 사용하세요.
자주 묻는 질문
빌더 패턴란 무엇인가요?
복잡한 객체를 단계적으로 구성하는 빌더 패턴. 메서드 체이닝으로 가독성을 높입니다.
빌더 패턴 학습 시 주의할 점은 무엇인가요?
빌더를 값 리시버로 구현하면 매 호출마다 복사되어 상태가 유지되지 않습니다. 포인터 리시버를 사용하세요.
Continue Learning
Go 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.