Java/Design Pattern

[헤드퍼스트 디자인 패턴] 12-5. 프로토타입 패턴

noahkim_ 2024. 12. 19. 00:39

에릭 프리먼 님의 "헤드퍼스트 디자인 패턴" 책을 정리한 포스팅 입니다


1. 프로토타입 패턴

어떤 객체의 인스턴스를 만들 때 자원이 많이 들거나 복잡할 경우

 

장점
  • 성능
    • 기존 인스턴스를 복사 (생성 X)
  • 클라이언트 코드에서 어떤 클래스의 인스턴스를 만드는지 모름

 

2. Game

Monster

// Prototype 인터페이스
public interface Monster extends Cloneable {
    Monster clone();
    void display(); // 몬스터의 모양을 화면에 표시
}
// 기본 몬스터 클래스
public class DefaultMonster implements Monster {
    private String shape; // 몬스터의 모양
    private String color; // 몬스터의 색상
    private int speed; // 몬스터의 이동 속도

    // 생성자
    public DefaultMonster(String shape, String color, int speed) {
        this.shape = shape;
        this.color = color;
        this.speed = speed;
    }

    @Override
    public Monster clone() {
        try {
            return (Monster) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
            return null;
        }
    }

    @Override
    public void display() {
        System.out.println("몬스터 모양: " + shape + ", 색상: " + color + ", 속도: " + speed);
    }

    // 몬스터의 속성 변경
    public void setShape(String shape) {
        this.shape = shape;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }
}

 

Map

// 게임에서의 맵 환경
public class GameMap {
    private Monster monsterPrototype;

    // 맵 환경에 맞는 몬스터 초기화
    public GameMap(Monster prototype) {
        this.monsterPrototype = prototype;
    }

    public Monster createMonster() {
        return monsterPrototype.clone();
    }

    public void updateMonsterForMap(String shape, String color, int speed) {
        Monster newMonster = createMonster();
        if (newMonster instanceof DefaultMonster) {
            DefaultMonster defaultMonster = (DefaultMonster) newMonster;
            defaultMonster.setShape(shape);
            defaultMonster.setColor(color);
            defaultMonster.setSpeed(speed);
            defaultMonster.display();
        }
    }
}
  • 객체 수정을 캡슐화
    • 맵의 환경에 따라 몬스터 인스턴스의 상태가 변함
  • 효율적
    • 객체를 생성하지 않고 수정