프로토 타입 패턴(Prototype Pattern)

INSANEZINDOL·2022년 3월 2일
0

Design Pattern

목록 보기
6/10
post-thumbnail

개요

특정 객체의 인스턴스를 생성할때 우리는 new 명령어를 사용해서 생성합니다. 이처럼 new 를 사용해서 인스턴스를 만들 경우에는 클래스 이름을 반드시 지정해야 합니다. 하지만, 클래스명을 지정하지 않고 인스턴스를 생성할 때도 있습니다.
인스턴스로부터 다른 인스턴스를 만드는 것은 복사기를 사용하는것과 비슷합니다. 원본 서류를 어떻게 만들었는지 몰라도 복사기로 같은 종류의 서류를 몇 장이든 만들 수 있습니다. Java에서는 cloneable 인터페이스와 clone 메소드를 이용합니다.

UseCase

  • 종류가 너무 많아 클래스로 정리되지 않는 경우
    ⇒ 첫 번째는 취급하는 오브젝트의 종류가 너무 많아서 각각을 별도의 클래스로 만들어 다수의 소스 파일을 작성해야 하는 경우.

  • 클래스로부터 인스턴스 생성이 어려운 경우
    ⇒ 생성하고자 하는 인스턴스가 복잡한 작업을 거쳐 만들어지기 때문에 클래스로부터 만들기가 매우 어려운 경우입니다.
    예를 들어, 게임캐릭터 커스터마이징 프리셋 인스턴스의 경우 모든 사용자에게 매번 새로운 각각(Ex: 눈썹,헤어스타일,턱선,눈화장, 키, 어깨너비 등..)의 인자값을 프로그래밍해서 생성하는것은 쉽지 않습니다. 해당 인스턴스를 다시 만들고 싶은 경우에는 지금 만든 인스턴스를 일단 저장해두고,
    그 등록된 인스턴스를 복사해서 새 인스턴스를 생성합니다.

  • framework와 생성할 인스턴스를 분리하고 싶은 경우
    ⇒ 인스턴스를 생성할 때의 framework를 특정 클래스에 의존하지 않도록 만들고 싶은 경우입니다.
    이와 같은 경우 클래스의 이름을 지정해서 인스턴스를 만드는 것이 아니라 이미 '모형' 이 되는 인스턴스를 등록해 두고, 그 등록된 인스턴스를 복사해서 인스턴스를 생성합니다.

프로토타입 패턴의 필요성

⇒ 그냥 new SometingClass()로 인스턴스를 생성하면 빠른데 어째서 프로토 타입 패턴(Prototype pattern)이 필요할까요.
위에서 UseCase를 통해 간략하게 정의했지만 좀 더 풀어서 예제를 참고해 설명하겠습니다.
예제에서는 (~,*, /) 세 가지 문자열을 사용한 3가지의 MessageBox 인스턴스를 만들었습니다만, 실무에서는 충분히 더 많은 종류의 인스턴스가 생성될 수 있습니다. 하지만 이걸 모두 각각의 클래스로 관리하기에는 너무 많기 때문에 관리의 용이성이 떨어집니다.
그리고, 클래스로부터 인스턴스 생성이 어려운 경우가 있다고 했는데, 쉽게 예를 들면 게임 캐릭터 커스터마이징 프리셋을 생각하시면 쉽습니다.

위처럼 다양한 스킬이 다 설정된 스킬세팅 인스턴스를 매번 프로그래밍해서 만드는건 몹시 번거롭고 어렵습니다. 그렇기에 클래스를 사용하는 것이 아닌 인스턴스를 복사해서 만드는 방법이 간단합니다.

참고

  • 클래스 이름은 속박인가
    ⇒ 특정 클래스명이 소스코드 안에 있을 경우 소스코드와 이 클래스를 분리해서 재사용할 수 없게됩니다. 물론, 소스를 고쳐서 클래스 이름을 변경할 수 있지만 '부품으로써 재이용' 관점에서 소스를 고칠 수 있는지는 중요하지 않습니다. Java에서는 클래스파일(.class)만 가지고 있더라도 그 클래스를 재사용 할 수 있는지가 중요합니다. 핵심은 소스 파일(.java)이 없어도 재사용할 수 있는지가 중점입니다.

  • 강결합이 되야하는 클래스 명이 소스 안에 있는것은 문제가 되지 않지만, 부품으로써 모듈화 해야하는 클래스 명이 소스안에 사용되는것은 문제가 됩니다.

profile
Java Backend Developer

0개의 댓글