객체 생성 과정을 추상화하여 코드의 유연성과 재사용성을 높이는 디자인 패턴 그룹입니다. 객체가 생성되는 방식이나 시점을 캡슐화하여, 시스템이 객체의 생성 방식에 독립적으로 동작하도록 합니다.
패턴 이름 | 정의 | 특징 | 장점 | 단점 | 사용 예시 | 고찰 |
---|---|---|---|---|---|---|
싱글톤 (Singleton) | 클래스의 인스턴스를 하나만 생성하고, 전역적으로 이 인스턴스에 접근할 수 있도록 합니다. | 전역 접근, 단일 인스턴스 보장 | 리소스, 설정 관리 등 공유 객체에 유용, 접근 용이 | 코드 결합도 증가, 테스트 어려움, 멀티스레드 환경에서 동기화 문제 발생 가능 | 시스템 설정, 로깅, DB 연결, 스레드 풀, 프린터 스풀러 | 의존성 주입과 함께 사용 권장, Spring 프레임워크에서 싱글톤 스코프로 쉽게 구현 |
프로토타입 (Prototype) | 기존 객체를 복제하여 새로운 객체를 생성합니다. | 객체 생성 비용 감소, 성능 향상 | 복잡한 객체 생성, 런타임에 객체 추가/제거 용이 | 객체 복제 과정 복잡 (특히 순환 참조 시), 깊은 복사/얕은 복사 구분 필요 | 문서 편집기, 그래픽 에디터 도형 복사, 게임 캐릭터 생성, 3D 모델링 프로그램 | 객체 생성 비용이 높거나 복잡할 때 효과적, 복제 로직 별도 클래스 분리 권장, (경험)DOM으로 여러개의 비슷한 요소 만들때 유용, |
팩토리 메서드 (Factory) | 객체 생성 인터페이스를 정의하고, 실제 인스턴스 생성은 서브클래스에서 결정합니다. | 객체 생성 로직과 클라이언트 코드 분리, 결합도 감소, 다양한 객체 생성 유연, 새로운 객체 타입 추가 용이 | 객체 생성 책임 분산, 코드 유지보수성 향상 | 클래스 수 증가 (상대적으로 복잡) | 다양한 종류의 DB 연결, 운영체제별 UI 요소, 게임 개발(다양한 캐릭터/아이템), 문서 처리 프로그램 | 객체 생성 로직을 캡슐화하고 클라이언트 코드로부터 분리, OCP 원칙 준수 |
추상 팩토리 (Abstract) | 관련된 객체들의 그룹(제품군)을 생성하는 인터페이스를 제공합니다. | 여러 객체를 일관된 방식으로 생성, 제품군 교체/확장 용이 | 관련 객체 그룹 생성 용이, 제품 일관성 유지 | 새로운 제품군 추가 어려움 | 다양한 운영체제 UI 컴포넌트, 여러 종류의 DB 지원, 게임 개발(특정 컨셉 관련 객체 그룹) | 팩토리 메서드 집합, 더 큰 범위 객체 생성 관리, 인터페이스 상속 강제 X, 팩토리 메서드는 단일 객체 일관성, 추상 팩토리는 관련 객체 그룹 일관성에 초점 |
빌더 (Builder) | 복잡한 객체를 단계별로 생성합니다. 객체 생성과 표현을 분리하여, 동일한 생성 프로세스로 다양한 표현을 생성할 수 있습니다. | 객체 생성 과정 세분화, 복잡한 객체 단순화, 가독성 향상, 다양한 설정 유연 처리, 불변 객체 생성 | 복잡한 객체 생성 용이, 설정 옵션 조합 유연 | 클래스 수 증가 (상대적으로 복잡) | 복잡한 설정 옵션 객체(자동차, 컴퓨터), 다양한 조합 부품 객체, 문서 빌더, SQL 쿼리 빌더 | 단순 객체 생성에는 불필요한 복잡성 초래, 객체 생성 과정이 복잡하고 다양한 설정 필요 시 유용, 생성자보다 유연 |
생성 패턴들은 단독으로 사용될 수도 있지만, 여러 패턴을 조합하여 더 강력하고 유연한 객체 생성 메커니즘을 만들 수 있습니다. 몇 가지 가능한 조합은 다음과 같습니다:
- 추상 팩토리 + 팩토리 메서드: 추상 팩토리는 제품군을 생성하는 인터페이스를 제공하고, 각 제품군 내에서 구체적인 객체 생성은 팩토리 메서드에 위임.
- 빌더 + 프로토타입: 빌더를 사용하여 복잡한 객체를 만들고, 프로토타입을 사용하여 생성된 객체를 복제하여 다양한 변형을 생성.
- 싱글톤 + 팩토리 메서드/추상 팩토리: 팩토리 메서드 또는 추상 팩토리 자체를 싱글톤으로 만들어 전역적으로 접근 가능한 팩토리를 제공.
생성 패턴은 객체 지향 프로그래밍에서 객체 생성의 유연성과 재사용성을 높이는 데 중요한 역할을 합니다. 각 패턴의 특징과 장단점을 이해하고, 상황에 맞게 적절한 패턴을 선택하거나 조합하여 사용하는 것이 중요합니다.