클래스의 인스턴스를 반환하는 단순한 정적 메서드
장점 5가지
- 이름을 가질 수 있다
- 호출될 때마다 인스턴스를 새로 생성하지는 않아도 된다
- 반환 타입의 하위 타입 객체를 반환할 수 있는 능력이 있다
- 입력 매개변수에 따라 매번 다른 클래스의 객체를 반환할 수 있다
- 정적 팩터리 메서드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다
단점
- 상속을 하려면 public이나 protected 생성자가 필요하니 정적 팩터리 메서드만 제공하면 하위 클래스를 만들 수 없다.
- 정적 팩터리 메서드는 프로그래머가 찾기 어렵다.
점층적 생성자
자바빈즈패턴
안정성과 가독성을 겸비한 빌더패턴
-
public static final 필드 방식의 싱글턴
public class Elvis{ public static final Elvis INSTANCE = new Elvis(); private Elvis() {} public void leaveTheBuilding() {} }
private 생성자는 초기화할때 딱 한번만 호출된다
public or protected 생성자가 없으므로 Elvis 클래스가 초기화 될때 만들어진 인스턴스가 하나뿐임이 보장됨
장점 : 해당 클래스가 싱글턴임이 API에 명백히 드러남
-
정적 팩터리 방식의 싱글턴
public class Elvis{
private static final Elvsi INSTANCE = new Elvis();
private Elvis() {}
public static Elvis getInstance() {return INSTANCE;}
public void leaveTheBuilding(){}
}
장점 : 추후에 API 변경 없이 싱글턴이 아니게 변경할 수 있다는 점
ex) 스레드 별로 다른 인스턴스 넘겨주기
- 열거 타입 방식의 싱글턴
public enum Elvis{
INSTANCE;
public void leaveTheBuilding(){}
}
추상 클래스로 만드는 것으로는 인스턴스화 막을 수 X → 하위에서 만들수 있기때문
private이므로 바깥에서 생성자에 접근할 수 없다
자원직접명시 하면 1가지 자원만 사용하게됨
자원이 상황따라 달라질 수 있으므로 인스턴스를 생성할때 생성자에 필요한 자원을 넘겨주도록
의존 객체 주입 사용
변형 : 생성자에 자원 팩터리를 넘겨주는 방식