본문 바로가기

Programming/Design Patterns

GoF 디자인 패턴 - 프로토타입 패턴 (Prototype Pattern)

반응형

1. 프로토타입 패턴이란?

프로토타입 패턴은 생성 패턴 (Creational Patterns)의 하나로써 기존 객체를 복사하여 새로운 객체를 생성하는 생성 패턴이다. 객체를 일일이 생성하는 대신, 기존 객체를 복제(clone)하여 동일한 값과 상태를 가진 객체를 빠르게 만들 수 있도록 한다.

특징

  • 객체 생성 비용 절감: 복잡한 객체를 새로 생성하는 것보다 기존 객체를 복제하는 것이 비용적으로 효율적이다.
  • 객체 생성 과정 단순화: 직접 생성자 호출 없이 동일한 속성을 가진 객체를 쉽게 만들 수 있다.
  • 런타임 동적 객체 생성 가능: 클래스의 인스턴스를 런타임에서 복제하여 유연한 객체 생성을 지원한다.

2. 프로토타입 패턴의 구조

  1. Prototype(프로토타입 인터페이스): 객체 복제를 위한 clone() 메서드를 정의한다.
  2. ConcretePrototype(구체적인 프로토타입 클래스): 프로토타입 인터페이스를 구현하고, clone() 메서드를 통해 자신을 복제한다.
  3. Client(클라이언트): 프로토타입 객체를 복제하여 새로운 객체를 생성한다.

3. 프로토타입 패턴 구현 예제

예제: 웹 개발에서 사용자 설정(Preferences) 객체 복제

// 1. 프로토타입 인터페이스
interface UserConfig extends Cloneable {
    UserConfig clone();
    void showConfig();
}

// 2. 구체적인 프로토타입 클래스
class UserSettings implements UserConfig {
    private String theme;
    private boolean notifications;

    public UserSettings(String theme, boolean notifications) {
        this.theme = theme;
        this.notifications = notifications;
    }

    @Override
    public UserConfig clone() {
        try {
            return (UserConfig) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new RuntimeException("Clone not supported", e);
        }
    }

    @Override
    public void showConfig() {
        System.out.println("Theme: " + theme + ", Notifications: " + notifications);
    }
}

// 3. 클라이언트 코드
public class PrototypeExample {
    public static void main(String[] args) {
        UserSettings defaultSettings = new UserSettings("Dark Mode", true);
        UserSettings clonedSettings = (UserSettings) defaultSettings.clone();
        
        clonedSettings.showConfig(); // 원본과 동일한 설정 출력
    }
}

4. 프로토타입 패턴의 장점과 단점

장점

  • 객체 생성 비용 절감: 복잡한 객체를 새로 만들지 않고 복제하여 빠르게 생성할 수 있다.
  • 유연한 객체 생성: 기존 객체의 구조를 유지하면서 일부 속성만 변경하여 새로운 객체를 만들 수 있다.
  • 캡슐화 유지: 객체의 내부 구조를 노출하지 않고 복제할 수 있다.

단점

  • 객체 복제의 복잡성: 깊은 복사(Deep Copy)와 얕은 복사(Shallow Copy)를 고려해야 한다.
  • 클론 메서드 구현 필요: 모든 클래스에서 clone() 메서드를 구현해야 하며, Cloneable 인터페이스를 사용해야 한다.

5. 활용 사례 (웹 개발 관련)

1) 사용자 설정 복제

웹 애플리케이션에서 사용자별 기본 설정을 제공할 때, 기본 설정 객체를 복제하여 사용자 맞춤 설정을 빠르게 생성할 수 있다.

2) 캐싱된 객체 복제

자주 사용되는 객체(예: 데이터베이스 연결 설정, API 요청 객체)를 캐싱하고 복제하여 성능을 최적화할 수 있다.

3) 프론트엔드 UI 상태 복제

리액트(React) 등의 프론트엔드 프레임워크에서 UI 상태 객체를 복제하여 상태 변경을 효율적으로 관리할 수 있다.


프로토타입 패턴은 객체 생성 비용을 줄이고, 객체를 빠르게 복제할 수 있는 장점을 제공한다. 웹 개발에서는 사용자 설정, 캐싱된 객체 복제, UI 상태 관리 등 다양한 분야에서 활용될 수 있으며, 성능 최적화와 코드의 유연성을 높이는 데 도움을 줄 수 있다.

 

반응형