PHpullh
학습 라이브러리/Python/팩토리 메서드

PYTHON · 객체지향

팩토리 메서드

클래스 메서드를 활용한 팩토리 패턴으로 다양한 방법으로 객체를 생성합니다.

객체지향중급factory팩토리classmethod생성 패턴

핵심 설명

클래스 메서드를 활용한 팩토리 패턴으로 다양한 방법으로 객체를 생성합니다.

Python code

from __future__ import annotations
from dataclasses import dataclass
from datetime import datetime

@dataclass
class User:
    name: str
    email: str
    created_at: str

    @classmethod
    def create(cls, name: str, email: str) -> User:
        return cls(name, email, datetime.now().isoformat())

    @classmethod
    def from_dict(cls, data: dict) -> User:
        return cls(**data)

    @classmethod
    def guest(cls) -> User:
        return cls("Guest", "guest@example.com",
                    datetime.now().isoformat())

# 다양한 생성 방법
u1 = User.create("Alice", "alice@test.com")
u2 = User.from_dict({"name": "Bob", "email": "bob@test.com",
                       "created_at": "2024-01-01"})
u3 = User.guest()

for u in [u1, u2, u3]:
    print(f"{u.name} ({u.email})")

# 상속에서도 올바르게 동작
class AdminUser(User):
    pass

admin = AdminUser.guest()
print(type(admin))  # <class 'AdminUser'>

학습 팁

@classmethod 팩토리는 cls를 사용하므로 서브클래스에서도 올바른 타입의 인스턴스를 생성합니다.

주의할 점

@staticmethod로 팩토리를 만들면 클래스명이 하드코딩되어 상속 시 부모 클래스 인스턴스가 생성됩니다.

자주 묻는 질문

팩토리 메서드란 무엇인가요?

클래스 메서드를 활용한 팩토리 패턴으로 다양한 방법으로 객체를 생성합니다.

팩토리 메서드 학습 시 주의할 점은 무엇인가요?

@staticmethod 로 팩토리를 만들면 클래스명이 하드코딩되어 상속 시 부모 클래스 인스턴스가 생성됩니다.

Continue Learning

Python 학습을 이어가세요

총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.