정적 팩토리 메소드란?
인스턴스를 생성자로 생성하지 않고 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();
}
}
여러 곳에서 공통으로 사용되는 인스턴스가 필요할 때 싱글톤 패턴을 사용하여 불필요한 객체 생성을 막을 수 있다.
정적 팩토리 메소드와 싱글톤 패턴을 직접 사용해봐야 더 와닿을 거 같다.
잘못이해 하고있는 부분이 있다면 알려주세요 :) 감사합니다 !!