팩토리 패턴
Coddy GO 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 107개 중 87번째.
Factory 패턴은 객체 생성을 별도의 function 또는 method에 위임하므로, 생성 로직을 노출하지 않고 인스턴스를 생성할 수 있습니다. 인스턴스 수를 제어하는 Singleton과 달리 Factory는 입력 매개변수를 기반으로 유연한 객체 생성에 중점을 둡니다.
Go에서 factory는 일반적으로 interface type을 반환하는 function으로, 통합된 API를 통해 서로 다른 구체적인 type을 생성할 수 있게 합니다:
type Notifier interface {
Send(message string) string
}
type EmailNotifier struct{}
type SMSNotifier struct{}
func (e EmailNotifier) Send(message string) string {
return "Email: " + message
}
func (s SMSNotifier) Send(message string) string {
return "SMS: " + message
}
func NewNotifier(notifierType string) Notifier {
switch notifierType {
case "email":
return EmailNotifier{}
case "sms":
return SMSNotifier{}
default:
return EmailNotifier{}
}
}factory 함수 NewNotifier는 어떤 구체 타입을 생성할지에 대한 결정을 캡슐화합니다. 클라이언트 코드는 Notifier interface만 사용하므로 특정 구현을 알 필요가 없습니다:
notifier := NewNotifier("sms")
result := notifier.Send("Hello!") // "SMS: Hello!"이 패턴은 런타임 조건에 따라 객체를 create해야 하거나, 복잡한 초기화 로직을 중앙 집중화하려 하거나, 클라이언트 코드를 수정하지 않고 새로운 타입을 쉽게 추가해야 할 때 특히 유용합니다. interface를 구현하는 새로운 struct를 추가하고 factory function을 업데이트하기만 하면 됩니다.
챌린지
쉬움Factory 패턴을 사용하여 문서 converter 시스템을 만들어 봅시다! 대상 format에 따라 다양한 문서 converter를 생성하는 factory를 만들고, client code가 통합된 interface를 통해 어떤 converter와도 작동할 수 있도록 합니다.
code를 두 파일에 걸쳐 구성합니다:
converter.go: converter interface와 구체적인 구현을 Define합니다.Converterinterface와 문서 content를 받아 변환된 출력을 반환하는Convert(content string) stringmethod를 Create합니다.세 가지 converter type을 Implement합니다:
PDFConverter: 해당Convertmethod는PDF: [content]를 반환합니다.HTMLConverter: 해당Convertmethod는HTML: <p>[content]</p>를 반환합니다.MarkdownConverter: 해당Convertmethod는MD: # [content]를 반환합니다.
NewConverter(format string) Converterfactory function을 Create하여 format string(pdf,html또는markdown)에 based하여 appropriate converter를 반환합니다. 인식할 수 없는 format인 경우 default로PDFConverter를 반환합니다.main.go: factory를 사용하여 converter를 Create하고 document를 처리합니다.format type과 document content를 Read합니다. factory를 사용하여 appropriate converter를 Create한 다음, content를 변환하고 result를 print합니다.
다음 입력이 제공됩니다:
- 1번째 줄: Format type (
pdf,html,markdown또는 그 외의 값) - 2번째 줄: 변환할 Document content
예를 들어 다음이 주어지면:
html
Welcome to Go Programming출력은 다음과 같아야 합니다:
HTML: <p>Welcome to Go Programming</p>그리고 다음이 주어지면:
markdown
Chapter One출력은 다음과 같아야 합니다:
MD: # Chapter One그리고 다음이 주어지면:
pdf
Annual Report 2024출력은 다음과 같아야 합니다:
PDF: Annual Report 2024그리고 다음이 주어지면:
docx
Meeting Notes출력은 다음과 같아야 합니다:
PDF: Meeting Notesmain code가 특정 converter type을 알 필요가 없다는 점에 주목하세요. main code는 factory에 converter를 요청하고 interface를 사용할 뿐입니다. 따라서 client code를 변경하지 않고도 나중에 새로운 format을 쉽게 추가할 수 있습니다!
직접 해보기
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
// 포맷 유형 읽기
scanner.Scan()
format := scanner.Text()
// 문서 내용 읽기
scanner.Scan()
content := scanner.Text()
// TODO: 팩토리를 사용하여 적절한 변환기를 생성
// TODO: 내용을 변환하고 결과를 출력
fmt.Println(result)
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
8에러 처리와 OOP
error 인터페이스사용자 정의 에러 타입에러 래핑 (fmt.Errorf)센티넬 에러errors.Is()와 errors.As()Panic, Defer, Recover요약 - 파일 파서직접 연습해 보세요: 온라인 Go 컴파일러