프로토타입 패턴은 생성 패턴(Creational Pattern) 중 하나로, 객체를 복제(clone)하여 새로운 객체를 생성하는 데 사용됩니다.
이 패턴은 이미 존재하는 객체를 복사해서 새로운 객체를 생성하는 것이 주된 아이디어이며, 복제가 필요한 상황에서 효율적인 솔루션을 제공합니다.
언제 프로토타입 패턴을 사용하나요?
- 복잡한 객체의 생성 비용이 높은 경우
- 기존 객체를 복제하는 것이 새로 생성하는 것보다 빠르고 효율적일 때.
- 객체의 구체적인 클래스 정보가 숨겨져야 할 때
- 구체적인 클래스에 의존하지 않고 객체를 생성할 수 있음.
- 객체의 상태를 포함한 동일한 속성을 가진 복제본을 생성해야 할 때.
구성 요소
- Prototype(원형) 인터페이스
- 객체 복제(clone)를 위한 인터페이스를 정의합니다.
- Concrete Prototype(구체적 원형)
- Prototype 인터페이스를 구현하며, 자신을 복제하는 메서드를 제공합니다.
- Client(클라이언트)
- Prototype 객체를 사용하여 복제를 요청합니다.
C++ 예제: 간단한 모양(Shape) 클래스
1. Prototype 인터페이스
- 역할
- Shape는 복제 가능한 모든 도형의 공통 인터페이스입니다.
- Clone() 메서드를 통해 객체를 복제합니다.
- Draw() 메서드는 객체의 동작을 정의합니다.
2. Concrete Prototype(구체적 원형)
Circle 클래스
Rectangle 클래스
- 역할
- Circle과 Rectangle은 각각 Shape 인터페이스를 구현합니다.
- Clone() 메서드를 통해 객체를 복제할 수 있습니다.
- 복제된 객체는 원본 객체와 동일한 속성(color)을 가집니다.
3. Client(클라이언트)
예제 설명
- Prototype 인터페이스 (Shape)
- Clone() 메서드를 통해 복제 기능을 정의했습니다.
- Draw() 메서드는 도형을 그리는 역할을 합니다.
- Concrete Prototype (Circle, Rectangle)
- Clone() 메서드를 통해 객체 자신을 복제합니다.
- 복사 생성자를 사용하여 객체의 속성(color)을 복사합니다.
- Client 코드
- 클라이언트는 원본 객체(circle, rectangle)를 복제(clonedCircle, clonedRectangle)하고, 복제된 객체가 원본과 동일한 동작을 수행하는지 확인합니다.
- 복제된 객체는 원본과 독립적이며, 새로운 메모리 공간에 생성됩니다.
프로토타입 패턴의 장점
- 객체 생성 비용 절감
- 복잡한 객체를 복제함으로써 객체 생성 비용을 줄일 수 있습니다.
- 유연성 증가
- 객체 생성 로직을 숨길 수 있어 클라이언트는 구체적인 클래스 정보에 의존하지 않습니다.
- 상태 보존
- 복제된 객체는 원본의 속성을 그대로 유지하므로 동일한 상태를 가진 객체를 생성할 수 있습니다.
프로토타입 패턴의 단점
- 객체 복제의 복잡성
- 깊은 복사와 얕은 복사 문제를 고려해야 합니다.
- 추가적인 메모리 관리 필요
- 동적으로 생성된 복제본의 메모리를 관리해야 합니다.
- 객체 구조 의존
- 객체 구조가 복잡하거나 순환 참조가 있을 경우 복제 구현이 까다로울 수 있습니다.
프로토타입 패턴의 활용 사례
- 게임: 게임 내 캐릭터, 아이템, 맵 등 복잡한 객체를 복제하여 성능 최적화.
- 그래픽 소프트웨어: 복잡한 그래픽 요소를 복제하여 재사용.
- 데이터 처리: 동일한 구조와 속성을 가진 객체를 다수 생성해야 할 때.
C++ 프로토타입 패턴은 객체 복제를 효율적으로 처리해야 하는 경우 강력한 도구가 될 수 있습니다.
'Computer Programming > C,C++,MFC' 카테고리의 다른 글
[C++] 빌더 (Builder) 패턴 사용 설명 및 예제 (0) | 2024.11.21 |
---|---|
[C++] 추상 팩토리 (Abstract Factory) 패턴 사용 설명 및 예제 (0) | 2024.11.20 |
[C++] 팩토리 메서드 (Factory Method) 패턴 설명 및 사용 예제 (0) | 2024.11.15 |
[C++] 싱글턴 (Singleton) 설명 및 사용 예제 (0) | 2024.11.14 |
[C++] 디자인 패턴이란? (1) | 2024.11.12 |