반응형

정적 팩토리 메서드를 사용하면 생성자에 비해 가질 수 있는 장단점이 존재한다.

 

 

장점

 

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 설명에 명확하게 드러나지 않아, 사용자가 정적 메스드를 찾아내야한다.

 

 

 

velog.io/@litien/%EC%83%9D%EC%84%B1%EC%9E%90-%EB%8C%80%EC%8B%A0-%EC%A0%95%EC%A0%81-%ED%8C%A9%ED%86%A0%EB%A6%AC-%EB%A9%94%EC%84%9C%EB%93%9C%EB%A5%BC-%EA%B3%A0%EB%A0%A4%ED%95%98%EB%9D%BC

velog.io/@ajufresh/%EC%83%9D%EC%84%B1%EC%9E%90-%EB%8C%80%EC%8B%A0-%EC%A0%95%EC%A0%81-%ED%8C%A9%ED%86%A0%EB%A6%AC-%EB%A9%94%EC%86%8C%EB%93%9C%EB%A5%BC-%EA%B3%A0%EB%A0%A4%ED%95%98%EB%9D%BC

it-mesung.tistory.com/184

반응형