PHpullh

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()로 최종 객체를 생성하세요.

주의할 점

빌더를 값 리시버로 구현하면 매 호출마다 복사되어 상태가 유지되지 않습니다. 포인터 리시버를 사용하세요.

자주 묻는 질문

빌더 패턴란 무엇인가요?

복잡한 객체를 단계적으로 구성하는 빌더 패턴. 메서드 체이닝으로 가독성을 높입니다.

빌더 패턴 학습 시 주의할 점은 무엇인가요?

빌더를 값 리시버로 구현하면 매 호출마다 복사되어 상태가 유지되지 않습니다. 포인터 리시버를 사용하세요.