1. 요약

GoF 중 생성 패턴으로 프로토 타입 패턴은 Clone을 이용하여 객체를 생성하는 방법입니다. 추상 팩토리 패턴의 경우 객체를 생성하는 코드를 파생 클래스에서 작성을 하였다면, 프로토 타입 패턴의 경우 파생 클래스에서는 객체를 생성하는 코드가 별도로 만들어지지 않습니다. 기존에 생성된 객체를 이용하여 해당 타입의 객체를 생성하게 됩니다. 

 

2. 프로토 타입 패턴

프로토 타입 패턴을 이용하기 위해서는 Prototype이 되는 추상 클래스가 필요합니다. 그리고 해당 클래스에서는 Clone이라는 메서드를 추상으로 선언하게 됩니다. 그리고 나머지 파생 클래스에서는 Clone 함수를 구현하게 됩니다. 그리고 실제 객체가 필요한 경우 PrototypeFactory를 이용해 필요한 객체를 만들 수 있습니다. 객체를 구분하는데 여러가지 방법이 있습니다. enum을 사용하거나, 객체별 id를 부여하거나, type를 비교할 수도 있습니다. 이렇게 객체의 타입을 구분할 수 있는 방법을 하나 선정하여서 이미 프로토 타입으로 인스턴스화된 객체로부터 새로운 객체를 가져오게 됩니다. 여기서 C#을 기준으로 예제 코드가 만들어지는데요. MemberwiseClone 이라는 함수를 사용하게 되는데요. 해당 함수는 객체를 복사한 새로운 객체를 object 타입으로 반환해주는 함수입니다. 

3. 예제

가장 기본이 되는 ProtoType 클래스입니다. 해당 클래스는 추상으로 되어있고, 여기에 id나 다른 변수와 메서드를 추가할 수 있습니다. 그리고 이 추상 클래스를 상속 받아 ConcreteProtoType1, 2, 3 .... 여러가지 파생 클래스를 생성할 수 있습니다. 현재는 생성된 클래스에 모두 Clone 함수를 재정의 해줘야합니다.

이런식으로 MemberwiseClone 함수를 이용해서 별도의 생성자를 통한 인스턴스를 생성하는게 아닌 기존의 객체를 복사하게 됩니다. 그렇다면 이제 ProtoType Factory를 만들어보도록 하겠습니다. 

Generic 을 활용하여 Type을 직접 입력 받아서 해당 타입에 맞는 객체를 생성하는 Factory 입니다. Factory 생성시 프로토 타입에 해당하는 인스턴스를 미리 만들어서 등록하는 것이 포인트입니다. 이렇게 되면 생성자에서 생성된 인스턴스를 기즌으로 새로운 객체들이 생성되게 됩니다.

실제 Main 함수에서는 이와 같이 만들어지게 됩니다. 이 방법 외에도 enum을 활용하거나 index를 활용하는 방법이 있는데.. 저는 위의 방법을 가장 선호합니다. 가장 직관적이고 별도로 enum이나 index를 생성하지 않아도 구현이 가능하기 때문입니다. 이렇게 구현을 하게 되면 향후 유지보수에 유리하게 됩니다.

+ Recent posts