**🌈 클래스의 인스턴스를 생성하는 방법?

⇒ 1) public 생성자 2) 정적 팩터리 메서드**

1) public 생성자

2) 정적 팩터리 메서드(static factory method)

2-1) 생성자 방식보다 뭐가 더 좋은데 ??

  1. 이름을 가질 수 있다.

    <aside> 👉

    한 클래스에 시그니처가 같은 생성자가 여러 개 필요할 것 같으면, 생성자를 정적 팩터리 메서드로 바꾸고 각각의 차이를 잘 드러내는 이름을 지어주자.

    </aside>

  2. 호출될 때마다 인스턴스를 새로 생성하지 않아도 된다.

  3. 반환 타입의 하위 타입 객체를 반환할 수 있는 능력이 있다.

    = 메서드 호출을 통해 얻을 객체의 인스턴스를 자유롭게 선택할수 있는 유연성을 갖는다는 것 !!

    interface SmarPhone {}
    
    class Galaxy implements SmarPhone {}
    class IPhone implements SmarPhone {}
    class Huawei implements SmarPhone {}
    
    class SmartPhones {
        public static SmarPhone getSamsungPhone() {
            return new Galaxy();
        }
    
        public static SmarPhone getApplePhone() {
            return new IPhone();
        }
    
        public static SmarPhone getChinesePhone() {
            return new Huawei();
        }
    }
    
  4. 입력 매개변수에 따라 매번 다른 클래스의 객체를 반환할 수 있다.

    interface SmarPhone {
        public static SmarPhone getPhone(int price) {
            if(price > 100000) {
                return new IPhone();
            }
    
            if(price > 50000) {
                return new Galaxy();
            }
    
            return new Huawei();
        }
    }
    

    <aside> 👉

    즉, 클라이언트는 팩터리가 건네주는 객체가 어느 클래스의 인스턴스인지 알 수도 없고 알 필요도 없음! 반환 타입의 하위 타입이기만 하면 됨!!

    </aside>

  5. 정적 팩터리 메서드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다.

2-2) 안좋은 점은 없느냐 ?!