반응형
정적 팩토리 메서드를 사용하면 생성자에 비해 가질 수 있는 장단점이 존재한다.
장점
1. 이름을 가질 수 있다.
생성자에 넘기는 매개변수와 생성자 자체만으로는 반환될 객체의 특성을 제대로 설명하지 못하지만
정적 팩토리 메서드를 이용하면 반환될 객체의 정보를 쉽게 전달 할 수 있다.
class House {
private String name;
private int room;
// 생성자에서 명시적 이름 불가능
public House(String name, int room){
this.chip = chip;
this.room = room;
}
// 정적 팩토리 메서드를 이용하여 명시적 이름 가능
public static House get84A() {
House house = new House();
house.name = "84A"
house.room = 3;
return house;
}
public static House getOneRoom() {
House house = new House();
house.name = "OneRoom"
house.room = 1;
return house;
}
}
2. 호출 될 때마다 인스턴스를 새로 생성하지 않아도 된다.
인스턴스를 새로 만들 필요 없이 새로 생성한 인스턴스를 캐싱하여 재활용 할 수 있기에 불필요한 객체 생성을 피할 수 있다.
ex) 싱글턴 패턴
3. 반환 타입의 하위 타입 객체를 반환 할 수 있다.
class WeaponUtil {
public static Weapon getWeapon(int damage) throws Exception {
if(0 <= damage && damage <= 50{
return new Sword();
} else if(50 < damage && damage <= 100) {
return new Gun();
}
throw new Exception("There is no weapon");
}
}
class Weapon { }
class Sword extends Weapon { }
class Gun extends Weapon { }
4. 정적 팩터리 메서드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다.
인터페이스나 클래스의 정적 팩터리 메서드가 만들어지는 시점에서 반환 타입의 클래스가 존재하지 않아도 된다는 것이다.
public class MyBook{
public static List<MyBookInterface> getInstance() {
new ArrayList<>();
}
}
public interface MyBookInterface{
// 아직 구현되지 않은 구현체
}
//1. 추 후 구현 클래스 생성
public class MyBookImpl implements MyBookInterface {}
//2. 클라이언트에서 활용
public class client{
public static void main(String [] args) {
List<MyBookInterface> myBookImpls = MyBook.getInstance();
//추 후에 구현한 클래스를 생성 후 List에 추가
MyBookInterface myBookImpl = new MyBookImpl();
myBookImpls.add(myBookImpl);
}
}
단점
1. 상속을 하려면 public이나 protected 생성자가 필요하니 정적 팩토리 메서드만 제공하면 하위 클래스를 만들 수 없다.
2. 정적 팩터리 메서드는 프로그래머가 사용하기위해 찾는 시간이 오래 걸린다. 즉, 생성자처럼 API 설명에 명확하게 드러나지 않아, 사용자가 정적 메스드를 찾아내야한다.
반응형
'Basic > Java' 카테고리의 다른 글
[Effective Java] Private 생성자나 열거타입으로 싱글턴임을 보증하라 (0) | 2021.01.27 |
---|---|
[Effective Java] 생성자에 매개변수가 많다면 빌더를 고려하라 (0) | 2021.01.27 |
Java 현재 시간으로부터 상대적 시간 계산(두 시간 차 계산) (0) | 2020.10.14 |
[Java] 16진수를 10진수로, 10진수를 16진수로 변경하기 (0) | 2020.08.18 |
Java에서 ArrayList, Array join하는 기본 방법 (0) | 2020.08.04 |