2012. 5. 22. 09:49

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

프로그램을 오래 하지 않은 사람이라면 객체가 필요할때마다 New 를 생성해서 객체를 생성해 사용 하였을 것이다.

하지만 객체를 생성할때 드는 비용이 컴퓨터 상에서는 만만치 않을 뿐더러, 너무 많은 클래스를 관리하다보면 서브 클래스를 줄이거나, 객체의 형태나 표현방식과는 무관하게 생성 하고 싶을 때가 있다. 


이를 위해 나온 것이 바로 프로토 타입! 이다. 


글씨에 테두리 모양을 넣는 객체를 생성한다고 하자.

우리는 이 글씨에 테두리를 넣을때마다 테두리 객체를 생성하여 넣어줘야 할 것이다. 

하지만 프로토타입 패턴을 이용하면 하나의 객체만을 생성하고 그 객체를 복사하여 쓸수 있다. 




정확한 표현은 아니지만 요런 느낌 이랄까?  NEW 생성자를 호출할 경우 생성자 내의 코드를 전부 재 반복해야 하기 때문에 연산이 많아진다. 하지만 메모리를 복사하여 사용할 경우 그 과정을 줄일 수 있게 된다. 

개발자는 코드로 대화하는게 가장 빠르다고 했던가?! 


아래그림과 같은 프로그램을 짠다고 생각해보자. 단순히 글짜 텍스트에 테두리를 넣어주는 프로그램이다. 


일반적으로 글자 주변에 ~~ 를 만드는 클래스, ****를 만드는 클래스, ///를 만드는 클래스 를 생성해 생성해 주어 각 클래스에 넣거나 많은 메소드(usingStar, usingSlash, using물결 ) 를 사용해서 각각을 호출 할 수 있도록 해 줘야 할 것이다. 하지만 이렇게 만들 경우에는 using 부분에 변경사항이 생겼을 때,수많은 메소드를 전부다 변경 시켜 줘야 하는 유지보수면 문제점이 생긴다. 



이때 이 객체를 하나만 생성하고 쓸때마다 복사해서 쓴다면?

그리고 두개 이상의 다른 객체를 하나의 메소드로 통일하여 사용 할 수 있다면?

 

Cloneable이라는 복사해주는 기본 클래스를 상속받아서 자신을 복사해주는 Product를 짠다. 

그리고 그때 그때 복사하여 사용해 주면 된다.



아래와 같이 구현  할 것이다. 



MessageBox 에서 Product의 use 추상 메소드를 각각 재정의 해주고, Project 형의 createClone() 메소드를 정의해준다. product 클래스에는 cloneable 클래스가 상속되어 있기 때문에 clone()이라는 메소드를 통해 자신을 복사 할 수 있다. 








우와같이 UnderLinePen 객체와 messageBox의 객체가 다른데도 불과하고 manager.register 를 통하여 각각의 객체를 등록 시켜 준다. 그리고 manager.create 를 하면 각각에 대당하는 객체로 복사를 하는것이다.


즉 다른 두 종류의 객체가 manager 를 통하여 하나로 묶어서 관리하게 된 것이다. 




이러한 프로토 타입의 사용 여부는 다른 디자인 패턴과 연동되어 많이 사용된다.

그 만큼 부작용이 적고 장점으로 뭉쳐 있는 디자인 패턴이다. 


Posted by k1rha