728x90

클래스가 내부적으로 하나 이상의 자원에 의존, 그 자원이 클래스 동작에 영향을 준다면 싱글턴과 정적 유틸리티 클래스는 사용하지 않는 것이 좋다. 직접 만들지 않고  필요 자원을 생성자에 넘겨준다.

의존객체 주입이라 하는 이 기법은 클래스의 유연성 , 재사용성, 테스트용이성을 기막히게 개선해준다.

 

728x90
728x90

private 생성자를 통해 인스턴스화를 막게되면  상속은 불가능.

모든 생성자는 명시적이든 묵시적이든 상위 클래스의 생성자를 호출하게 되는데, 이를 private으로 선언했으니 하위 클래스가 상위 클래스의 생성자에 접근할 길이 막혀버린다.

728x90
728x90

싱글턴을 만드는 방식

첫번째 public static 멤버가 final 필드로 생성 하는 방법

두 번째 정적 팩토리 메서드를 public static 멤버로 제공.

세 번째 원소가 하나인 열거 타입을 선언하는 것

728x90
728x90

아이템1에서 적정 팩토리 메소드/팩토리 메소드, 선택적 매개변수가 많을 경우 적절히 대응하기 어렵다. 

 

해당 챕터에서 예시로 나오는 

점층적 생성자 패턴(telescoping constructor pattern)

위 패턴의 최악의 단점은  계속해서 내가 필요한 만큼 인스턴스를 늘려가야하는게 최악의 단점이다.

그리고 매개변수가 늘어가면 코드 가독성이 굉장히 떨어지게된다.

 

자바빈즈 패턴

객체 하나를 만들려면 메서드를 여러개 호출해야 하고, 개체가 완전히 생성되기 전까지는 일관성(consistency)이 무너진다.

또한 불변으로 만들 수 없다. 이 단점 보완을 위해 생성이 끝난 객체를 수동으로 얼리고(freezing) 얼리기 전에는 사용 할 수 없도록 해야한다.

 

 

위 2가지 패턴의 장점을 합친 방식이 빌더 패턴(Builder pattern)이다.

객체를 직접 만드는 대신 필수 매개변수만으로 생성자를 호출해 빌더 객체를 얻는다. 그리고 매개변수 없이 build 매서드를 통해 불변 객체를 얻을 수 있다.

빌더패턴은  명명된 선택적 매개변수(named optional paraemters)를 흉내 낸것이다.

이 패턴은  계측적으로 설계된 클래스와 쓰기 좋고 매개변수가 많을때 쓰면 좋다.

 

 

 

 

728x90
728x90

 

 

정적 팩토리 메서드와 팩터리 메서드 디자인 패턴과는 다르다.

 

장점

1. 이름을 가질 수 있다.
2. 호출될 때마다 인스턴스를 새로 생성하지는 않아도 된다. 
3. 반환 타입의 하위 타입 객체를 반환할 수 있는 능력이 있다. 
4. 입력 매개변수에 따라 매번 다른 클래스의 객체를 반활할 수 있다. 
5. 정적 팩터리 메서드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다. 

 

단점

1. 상속을 하려면 public이나 protected생성자가 필요하니 정적 팩터리 메서드만 제공하면 하위 클래스를 만들 수 없다.
2. 정적 팩터리메서드는 프로그래머가 찾기 어렵다.

 

정적 팩터리 메소드 명명방식

from - 매개변수를 하나 받아서 해당 타입의 인스턴스를 반환하는 형변환 메서드
of- 여러 매개변수를 받아 적합한 타입의 인스턴스를 반환하는 집계메서드
valueOf - from과  of의 더 자세한 버전 
instance OR getInstance - (매개변수를 받는다면 ) 매개변수로 명시한 인스턴스를 반환하지만, 같은 인스턴스임을 봊아하지는 않는다. 
create OR newIstnace - instance 혹은 getInstance와 같지만, 매번 새로운 인스턴스를 생성해 반환함을 보장한다.
getType - getInstance와 같으나 생성할 클래스가 아닌 다른 클래스에 팩터리 메서드를 정의할 때 쓴다. "Type"은 팩터리메서드가 반환할 객체의 타입이다. 
newType - newInstance와 같으나, 생성할 클래스가 아닌 다른 클래스에 팩터리 메서드를 정의할 때 쓴다. "Type"은 팩터리메서드가 반환할 객체의 타입이다. 
type - getType과 newType의 간결한 버전

 

핵심정리

정적 팩터리 메서드와 public 생성자는 각자으 ㅣ쓰임새가 있으니 상대적인 장단점을 이해하고 사용하는 것이 좋다. 그렇다고 하더라도 정적 팩터리를 상용하는게 유리한 경우가 더 많으므로 무작정 public 생성자를 제공하던 습관이 있다면 고치자.
728x90

+ Recent posts