시스템아 미안해
CHAPTER 2 - Item1. static factory method 본문
Item1 - 객체 생성을 위해 constructors대신 static factory methods 사용을 고려해라.
( 주의해야할건 디자인 패턴의 'factory pattern' 과는다르다,, )
생성자 대신 사용할 static factory methods 의 이점
1. 명확한 메소드명을 지닐 수 있고, 이는 사용 용도를 명확히 한다. 생성자 사용시 사용할 객체의 역할이 다른 생성자 argument를 잘못 넘길 수 있고, 자칫 다른 반환체를 받을 가능성이 있다.
2. 새로운 객체 생성시 매번 호출되지 않는다. 같은 객체를 반복 요청해도 생성자처럼 매번 새로 생성하는 것이 아닌 재사용할 수 있도록 instance-controlled(인스턴스 통제)를 하게 한다. ( 생성자를 private 으로 선언하여 new 키워드를 통한 객체 생성을 막고, static factory method를 이용하여 인스턴스를 없다면 생성하고, 있다면 존재중인 객체를 반환토록 한다)
3. 본인 타입의 객체만 반환 가능한 생성자와는 달리 하위 타입의 객체로 반환 가능하다. 복잡한 문제를 더 작은 문제로 세분화하여 관리하고 이해하기 쉽게 하기 위한 interface-based frameworks 와 직결된다. 사용자는 복잡한 구현체를 굳이 알지 않아도 되는것.
(유의할 점은 interface에서의 static method는 자바 8버전 이후 가능)
4. 3번 장점인 하위 타입의 객체로 반환할 때, 인자에 따라 각각 다른 하위 클래스를 반환시킬 수 있다.
5. static factory method 작성 시점에선 사용하게 될 구현클래스가 반드시 존재할 필요는 없다. 필요한 구현체를 사용할 때마다 원하는 것으로 갈아 끼울 수 있는것. 이런 유연한 구조는 service provider framework를 만드는 근간이 된다고 한다. JAVA 에서의 대표적인 service provider framework는 JDBC, ServiceLoader(JAVA 5 이후 범용 service provider framework)가 있다.
JDBC를 예로 들면, JDBC(Service Provider)의 Driver(Service Provider Interface)를 벤더사에 제공하면 각각의 벤더사는 그의 기능에 맞는 JDBC Driver 구현체를 개발 후 배포한다. 이는 JDBC내의 직접적인 수정이 아닌 SPI를 이용한 API를 교체할 대상이다.
사용자는 DB 벤더사의 Driver 파일 다운로드, classpath에 추가, 로드 하여 클래스 로더에 인식시키면 끝이다. DB와 어플리케이션의 연결을 위한 Connection(Service Interface)을 실행하기 위해 사용 시점에서 DriverManager(Service Interface).getConnection(Service Access API) 인자에 사용중인 db 정보를 넘겨 호출하기만 하면 DriverManager가 찾아주는 구현체를 사용할 수 있다.
- JAVA ServiceLoader
https://velog.io/@adduci/Java-%EC%84%9C%EB%B9%84%EC%8A%A4-%EB%A1%9C%EB%8D%94ServiceLoader
[Java] 서비스 로더(ServiceLoader)
🚀보통 자바 기초서에 등장하지 않기 때문에 서비스 로더가 생소하게 느껴진다.서비스 로더는 주로 애플리케이션 내부에서 플러그인을 제공할 때 사용하는데, 전체적인 원리는 특정 기능을 제
velog.io
- API와 SPI의 차이
[프로그래밍] SPI와 API 차이
SPI와 API의 차이점API는 API(Application Programming Interface)의 약자로 API는 일종의 소프트웨어나 플랫폼에서 제공하는 서비스/기능에 액세스 하는 수단입니다. SPI는 SPI(Service Provider Interface)의 약자로, SP
12bme.tistory.com
단점
1. 상속에 필요한 public/protected 생성자가 없이 static factory method만 존재하는 class는 부모 class가 될 수 없다.
2. 개발자 입장에서 static factory method의 적절한 사용처를 찾기 쉽지 않다. 일반적인 개발 프로세스에선 생성자를 호출하여 객체를 생성하기 때문에 다른 네이밍의 static factory method를 사용하려면 결국 API문서화가 굉장히 잘 돼있어야 한다.