728x90
반응형
생성자 대신 정적 팩토리 메서드 사용법과 사용하는 이유
생성자는 클래스에서 객체를 생성할 때 호출되는 메서드
정적 팩토리 메서드는 객체를 생성하기 위해 클래스에서 제공하는 정적 메서드
생성자와 정적 팩토리 메서드 사용법
생성자
public class Person {
private int value;
public Person(int value) {
this.value = value;
}
}
정적 팩토리 메서드
public class Person {
private int value;
private Person(int value) {
this.value = value;
}
public static Person createPerson(int value) {
return new Person(value);
}
}
정적 팩토리 메서드 사용 이유?
이름을 가질 수 있음
생성자는 클래스의 이름과 동일한 이름을 사용함
정정 팩토리 메서드는 개발자가 원하는 이름을 사용할 수 있음
(이는 장점이자 단점이 될 수 있음)
호출할 때마다 새로운 객체를 생성하지 않아도 됨
정정 팩토리 메서드를 사용하면 객체를 매번 새로 생성하지 않아도 캐싱된 객체를 반환할 수 있음
이를 통해 메모리 사용량을 줄이고, 객체 생성 비용도 줄일 수 있음
아래와 같이 생성자를 사용하면 호출 시마다 새로운 객체 생성됨
Person person1 = new Person("nana", 30);
Person person2 = new Person("jerry", 30);
person1과 person2는 서로 다른 객체임
정적 팩토리 메서드를 통해 캐싱된 객체 사용
public class Person {
private int value;
private static final Map<Integer, Person> cache = new HashMap<>();
private Person(int value) {
this.value = value;
}
public static Person from(int value) {
if (cache.containsKey(value)) {
System.out.println("캐싱되었습니다.");
return cache.get(value);
} else {
Person person = new Person(value);
System.out.println("새로 생성되었습니다.");
cache.put(value, person);
return person;
}
}
}
하위 클래스의 객체를 반환할 수 있음
생성자는 반드시 현재 클래스의 객체를 반환해야 함
정적 팩토리 메서드는 하위 클래스의 객체를 반환할 수 있음
interface OS {
public static OS getLinux() {
return new Ubuntu();
}
public static OS getWindows() {
return new WindowsEleven();
}
public static Os getMac() {
return new MacOSMonterey();
}
}
API 변경이 용이함
생성자를 사용하면 클래스의 인터페이스를 변경할 때 API를 변경해야함
하지만 정적 팩토리 메서드를 사용하면 API를 변경하지 않고도 새로운 기능을 추가할 수 있음
반응형