라즈베리파이반

라즈베리파이 등 컴퓨터계열 게시판입니다.

제목디자인 패턴(Design Pattern) : 빌더 / 프로토타입2022-06-07 03:14
작성자user icon Level 4

88x31.png


1. 빌더 패턴(Build Pattern)


빌더 패턴은 객체의 생성 과정과 표현 방법을 분리하여 동일한 객체 생성 과정에서 다양한 표현을 만드는 패턴입니다. 이 패턴은 선택적인 파라미터가 많거나 지속성 없는 상태값을 처리해야 하는 문제를 해결해줍니다. 건물의 골격을 세워 아래에서 위로 조금씩 만들어 나가듯이 파라미터를 한꺼번에 처리하는 것이 아니라 하나씩 쌓아아가면서 마지막에 빌드 메소드를 통해 최종 결과물을 제공합니다.


클래스 다이어그램은 다음과 같습니다.

1920px-Builder_UML_class_diagram.svg.png

Builder는 Product 객체의 부분적인 요소들을 생성하기 위한 추상적인 인터페이스를 정의하고 ConcreteBuilder에 의하여 인터페이스가 구현되어 빌더를 합성합니다. Director는 Builder 인터페이스를 사용하는 객체를 합성합니다.


시퀀스 다이어그램으로도 표현할 수 있습니다.

image?src=https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Ff1e929e1-382b-4ce8-98ed-205c64659fc6%2F_2020-08-10__10.29.33.png&blockId=01da1688-64fb-493c-a031-b70c4318ba90 


예제코드를 작성해보겠습니다.


Rect.java:

b++OTRAIggCKDmi0kRVYg6G5gZUY2IOJYHQtWIFlmYqCGGxsAwYDDnge7xWwXHSfvVlu47qZxWm7jHPpwgD8Wv0M4zEXC4AJMvQGIEUwAEgpDcawesbr9veX+AHwQcnbfXe8x2HdI2IRl73fggBMkQuUAEgxwwAg5etPUq21iucAYOTsMABIKTvS1HuvWgqAEbLDACBFMABIEQwAUgQDgBTBACBFMABIEQwAUgQDgJQ3Ffbc7UV4ZNcAAAAASUVORK5CYII= 


Rect 클래스는 Director에 해당하며 생성자가 private로 되어있어서 오직 Builder 클래스를 통해서만 객체를 생성할 수 있습니다. Bilder 클래스는 초기화 파라미터로 width와 height를 가지며, 선택적 파라미터로 margin과 padding을 설정할 수 있습니다. 마지막으로 build 메소드를 실행시키면 Rect 객체가 생성됩니다!


BuilderPattern.java:

HJxMnwAAAABJRU5ErkJggg== 


B0HWIghRSgLnAAAAAElFTkSuQmCC 



2. 프로토타입 패턴(Prototype Pattern)


프로토타입 패턴은 프로토타입 인스턴스를 복사해서 새로운 객체를 생성하는 패턴입니다. 


다음과 같이 스킬트리가 있다면 스킬 하나하나는 객체에 해당할 것입니다. 만약 스킬을 슬롯에서 교체할때마다 새로운 객체를 생성한다면 비용이 클 뿐만 아니라 관리도 힘들것입니다. 이미 생성되어있는 객체를 복사한다면 이를 해결할 수 있을것입니다.


ecbaa1ecb298.JPG


클래스 다이어그램은 다음과 같습니다.


1920px-Prototype_Pattern_ZP.svg.png


자바에서는 clone() 메소드를 통해 해당 패턴을 구현할 수 있습니다.


Skill.java:

v6e2IWIiHRTHgkkGsBKRKT36jN8+PA73i6EiIj4LvXaEhERQxRIRETEEAUSERExRIFEREQMUSARERFDFEhERMQQBRIRETFEgURERAxRIBEREUP+P3vBMJ77axziAAAAAElFTkSuQmCC 

Cloneable 인터페이스를 상속받습니다.


Prototype_test.java:

8cvAPjpUrPuygghhEg80iIRQgihS9SmWLW3t0erKCGEEAlEWiRCCCF0kUAihBBCFwkkQgghdJFAIoQQQhcJJEIIIXSRQCKEEEIXCSRCCCF0+X+KzT5uC5PvuAAAAABJRU5ErkJggg== 


UAAAAAElFTkSuQmCC 


두 스킬이 동일하게 되었습니다. 이는 얕은 복사가 되었기 때문입니다. 얕은 복사는 값이 아닌 레퍼런스(주소값)을 복사하기때문에 동일한 메모리를 사용하고 있는 것입니다. 깊은 복사를 통해 객체를 완전히 복사해보겠습니다.


Skill.java:

n9TXxTsQ7euRgAAAABJRU5ErkJggg== 


다시 실행하면 깊은 복사가 일어났음을 확인할 수 있습니다.

D9RmRbOKOin6AAAAABJRU5ErkJggg== 

#디자인 패턴# 빌더 패턴# 프로토타입 패턴
댓글
자동등록방지
(자동등록방지 숫자를 입력해 주세요)