빌더패턴란
빌더패턴
- 클래스에서 필드들이 많으면 인스턴스를 생서할때나 생성자를 좀 더 다양하게 만들때 코드들이 복잡해지는 문제가 발생한다.
-
빌더 패턴을 사용해 원하는 인스턴스를 자유자재로 만들수 있다. 빌더패턴을 사용하지 않고 생성자로만 만들었으면 그만큼 생성자가 많아져 코드의 복잡도가 높아지고(생성자는 이름을 바꾸지 못하니 헷갈림) 사용하지 않는 필드값들도 null을 넣어줘야 하는 문제가 발생
-
빌더패턴으로 묶어준 코드들중 반복되는 코드를 메서드 추출로 한번더 TourDirector 로 감싸준다.
Pros/Cons
Pros
- 만드릭 복잡한 객체를 순차적으로 만들수 있다
- 복잡한 객체를 만드는 과정을 숨 수 있다 (캡슐화)
- 불완전한 객체를 사용하지 못하도록 방지가능 ( 마지막 getMethod)
- 동일한 프로세스를 통해 각기 다르게 구성된 객체를 만들수 있다.
Cons
- 복잡성 증가
- 원하는 객체를 만들려면 빌더부터 만들어야함
프로토타입 패턴
- 디비에서 혹은 네트워크를 통해서 가져온 인스턴스를 생성해야 하는경우 반복되면 리소스낭비가 심하다. 그런 방법대신에 복사를 해서 새로운 인스턴스를 만들고 그인스턴를 우리가 원하는대로 변경만해서 사용하면 훨씬 효율적으로 사용 가능하다
- 복제 기능을 가지고 있는 기존 인스턴스를 프로토타입을 사용해서 새로운 인스턴스를 만들 수 있다.
- 기존 인스턴스를 사용해서 새로운 인스턴스를 만들때 반복되는 코드들이 많다.
- 새로운 인턴스라 주소값은 다르지만 클론객체라 안쪽 내용은 같아야한다.
프로토타입 패턴 실습
- clone() 를 사용하려면 사용하려는쪽에서 cloneable 를 구현해야 한다.
- clone method를 기본형식으로 오버라이드한뒤 바로 사용 가능하다. 앞서 말했듯이 clone과 진짜 인스턴스의 주소는 달라야하며, 하지만 내용은 같아야한다. 위 코드 경우에는 셋다 true가 나와야함
- 기본적으로 자바에서 제공하는 clone()는 얕은복사가 디폴트 값이다. 즉 clone된 객체에 있는 repository는githubIssue에 들어있는 같은repository를 가르킨다. 원본 내용이 바뀌면 clone내용도 바뀜( 같은 객체를 가르키니까)
- override 한 clone()를 깊은복사로 바꿔줄수 있다. 깊은복사는 같은 객체를 가르키는것이 아니고 서로 다른 객체를 가르키기때문에 변동사항에대해 영향을 받지 않는다.
=> 객체생성이 복잡하고 길면 clone을 사용해주자!
Pros/Cons
Pros
- 복잡한 객체 생성과정을 숨길수 있다.
- 기존 방식으로 인스턴스를 만드는것보다 메모리를 절약할수 있다.
Cons
- 순환참조가 있는경우 과정자체가 더 복잡해질수 있다.