클라이언트가 특정 클래스의 인스턴스를 얻으려면 new 연산자로 public 생성자를 호출하면 된다.
하지만 이는 많은 단점을 가지고 있다.
1) 생성자는 오버로딩되어 파라미터에 따라 다양한 형태가 존재하는데, 생성자는 모두 동일한 이름이라 어떤 생성자가 어떤 종류의 인스턴스를 생성하는지 알 수 없다.
2) new 연산을 할 때마다 객체가 하나씩 생성되므로, 호출이 잦은 객체인 경우 쓸데없이 많은 객체가 생성될 수 있다.
3) 자기 자신의 인스턴스만 생성 가능하다.
4) 클라이언트와 생성하려는 클래스의 생성자를 참조하가 위해 클래스를 import 해야하므로 결합도가 올라간다.
이는 정적 팩터리 메서드로 해결 가능하다.
1) 생성자는 오버로딩되어 파라미터에 따라 다양한 형태가 존재하는데, 생성자는 모두 동일한 이름이라 어떤 생성자가 어떤 종류의 인스턴스를 생성하는지 알 수 없다.
-> 메소드명으로 원하는 인스턴스의 종류를 명시하면 된다.
2) new 연산을 할 때마다 객체가 하나씩 생성되므로, 호출이 잦은 객체인 경우 쓸데없이 많은 객체가 생성될 수 있다.
-> 불변객체를 만들어 return하면 해결 된다.
3) 자기 자신의 인스턴스만 생성 가능하다.
-> Return 타입은 하위객체도 가능하므로, 자신의 자식 객체도 유연하게 반환할 수 있다.
4) 클라이언트와 생성하려는 클래스의 생성자를 참조하가 위해 클래스를 import 해야하므로 결합도가 올라간다.
-> Return 타입을 인터페이스로 지정하면, 클라이언트는 굳이 특정한 구현체 클래스를 import하지 않아 결합도가 떨어진다.
정적 팩터리 메서드의 단점
1) 상속이 불가능하다.
public, protected 정도의 접근제어자가 선언된 생성자가 필요하다.
2) 정적(static)이므로 인스턴스가 존재하지 않으므로, 개발자가 찾기 힘들다. 문서화를 잘해야 한다.
'Dev > JAVA' 카테고리의 다른 글
[Effective JAVA] 인스턴스화를 막으려거든 private 생성자를 사용하라. ( 아이템 4 ) (0) | 2024.03.20 |
---|---|
[Effective JAVA] private 생성자나 열거타입으로 싱글턴임을 보증하라. ( 아이템 3 ) (0) | 2024.03.20 |
[ModernJAVA] Stream이 필요한 이유 (0) | 2024.03.05 |
[JAVA] String, StringBuffer, StringBuilder의 차이 (0) | 2024.02.23 |
[JAVA] Garbage Collector 동작원리 (0) | 2024.02.23 |