본문 바로가기
JAVA

정적 팩토리 메소드(Static Factory Method)

by 엉아멋지지 2024. 3. 31.
정적 팩토리 메소드란?

인스턴스를 생성자로 생성하지 않고 static 메소드로 생성하는 것.

 

자동차 브랜드와 색상을 필드로 가진 Car 클래스가 있다.

  • 생성자를 통해 인스턴스를 생성
public class Car {
    private String brand;
    private String color;

    public Car(String brand, String color) {
        this.brand = brand;
        this.color = color;
    }
}

 

  • 정적 팩토리 메소드를 통해 인스턴스 생성
public class Car {
    private String brand;
    private String color;

    private Car(String brand, String color) {
        this.brand = brand;
        this.color = color;
    }
 
    public static Car createCar(String brand, String color) {
        return new Car(brand, color);
    }
}

난 이거만 봤을땐 정적 팩토리 메소드를 사용해야 하는 이유를 잘 몰랐다.

 

- 가독성 향상

// 생성자 사용 시
public Car(String color){
    this.brand = "hyundai";
    this.color = color;
}
public Car(String color){
    this.brand = "kia";
    this.color = color;
}

만약 현대차와 기아차를 만드는 생성자를 만드려고 할때 두 생성자의 시그니처가 동일하게 되므로 사용이 불가능 해진다.

*시그니처란 메서드의 리턴타입, 파라미터의 데이터 타입, 파라미터 개수 3가지의 정보를 말한다.

// 정적 팩토리 메서드 사용시
private Car(String brand, String color) {
    this.brand = brand;
    this.color = color;
}

public static Car createHyundaiCar(String color) {
    return new Car("hyundai", color);
}

public static Car createKiaCar(String color) {
    return new Car("kia", color);
}

 

메서드의 이름을 명시하므로 사용시 가독성이 올라간다.

// 기존 생성자 사용 시
Car hyundaiCar = new Car("hyundai", "red");
Car kiaCar = new Car("kia", "black",);

// 정적 팩토리 메서드 사용 시
Car hyundaiCar = Car.createHyundaiCar("red");
Car kiaCar = Car.createKiaCar("red");

 

 

- 싱글톤 패턴 구현 가능

// LazyHolder 싱글톤 패턴
public class Singleton {
    private Singleton(){};
    
    public static Singleton getInstance() {
        return LazyHolder.INSTANCE;
    }

    private static class LazyHolder{
        private static final Singleton INSTANCE = new Singleton();
    }
}

 

 

 

 

여러 곳에서 공통으로 사용되는 인스턴스가 필요할 때 싱글톤 패턴을 사용하여 불필요한 객체 생성을 막을 수 있다.

동일한 객체의 주소를 가르키고 있다

 

정적 팩토리 메소드와 싱글톤 패턴을 직접 사용해봐야 더 와닿을 거 같다.

잘못이해 하고있는 부분이 있다면 알려주세요 :) 감사합니다 !!