디자인패턴
디자인패턴 - 팩토리 패턴
traveler_JH
2024. 12. 12. 21:12
팩토리 패턴(Factory Pattern)
- 객체 생성 로직을 캡슐화 하여 클래스의 인스턴스를 생성하는 책임을 팩토리라는 별도의 클래스 또는 매서드로 분리하는 디자인 패턴
- 객체를 사용하는코드(client)에서 객체 생성부분을 떼어내 추상화한 패턴이자 상속관계에 있는 두 클래스(product)에서 상위 클래스(factory)가 중요한 뼈대를 결정하고 하위 클래스에서 객체 생성에 관한 구체적인 내용을 결정하는 패턴
- 상위 클래스와 하위 클래스가 분리 되기때문에 느슨한 결합을 가지며 상위클래스에서는 인스턴스 생성방식에 대해 알필요가 없어서 많은 유연성을 가진다.
- 즉, 객체를 직접 생성하는 대신, 팩토리 클래스나 매서드를 통해 객체를 생성 하여 객체 생성 과정을 유연하고 확장가능하게 만든다.
특징
- 객체 생성 로직의 캡슐화
- 객체 생성 로직을 클라이언트 코드에서 분리하여 코드 유지보수를 용이하게 한다.
- 유연성
- 생성할 객체의 종류가 변경되거나 확장될경우 클라이언트 코드를 수정하지 않아도 된다.
- 코드의 일관성
- 객체 생성 과정이 통제되므로 코드의 일관성이 유지된다.
구조
- 구성요소
- 팩토리 (Factory)
- 객체를 생성하는 매서드나 클래스를 제공
- 어떤 객체를 생성할지 결정
- 제품(Product)
- 팩토리에서 생성된 객체
- 일반적으로 인터페이스나 추상 클래스로 정의
- 클라이언트(Client)
- 팩토리를 사용해 객체를 생성하고 사용
- 팩토리 (Factory)
구현 예제
// 추상 클래스(팩토리)(Product)
class Car {
constructor(brand, speed) {
this.brand = brand;
this.speed = speed;
}
drive() {
console.log(`${this.brand} is driving at ${this.speed} km/h`);
}
}
//구체적인 팩토리(하위 클래스)(Factory)
class CarFactory {
static createCar(type) {
if (type === "sports") {
return new Car("Ferrari", 300);
} else if (type === "suv") {
return new Car("Range Rover", 150);
} else {
return new Car("Toyota", 100);
}
}
}
// 클라이언트 코드
const sportsCar = CarFactory.createCar("sports");
sportsCar.drive(); // Ferrari is driving at 300 km/h
const suvCar = CarFactory.createCar("suv");
suvCar.drive(); // Range Rover is driving at 150 km/h
작동 방식
- 클라이언트가 CarFactory.createCar("sports")를 호출:
- type이 "sports"이므로 CarFactory는 Car("Ferrari", 300) 객체를 생성하여 반환.
- 클라이언트가 sportsCar.drive() 호출:
- 반환된 객체의 drive() 메서드를 호출하여 동작.
- 결과: Ferrari is driving at 300 km/h
- 클라이언트가 CarFactory.createCar("suv")를 호출:
- type이 "suv"이므로 CarFactory는 Car("Range Rover", 150) 객체를 생성하여 반환.
- 클라이언트가 suvCar.drive() 호출:
- 반환된 객체의 drive() 메서드를 호출하여 동작.
- 결과: Range Rover is driving at 150 km/h
팩토리 패턴의 장점
- 객체 생성의 유연성:
- 팩토리 메서드에서 다양한 객체를 생성할 수 있다.
- 예를 들어, 설정 파일이나 사용자 입력에 따라 동적으로 객체를 생성할 수 있다.
- 코드 유지보수성 향상:
- 객체 생성 로직이 한 곳에 집중되므로 수정이 용이하다.
- 클라이언트는 생성 로직을 알 필요가 없다.
- 확장성:
- 새로운 객체 유형을 추가할 때, 클라이언트 코드를 수정하지 않아도 된다.
팩토리 패턴의 단점
- 복잡성 증가:
- 단순한 프로그램에서는 불필요하게 설계를 복잡하게 만들 수 있습니다.
- 남용의 위험:
- 모든 객체 생성을 팩토리로 처리하면 코드가 지나치게 분리되어 가독성이 떨어질 수 있습니다.
팩토리 패턴이 적합한 경우
- 객체 생성 로직이 복잡하거나 다양할 때:
- 객체 생성 과정이 복잡하거나 다양한 입력에 따라 다른 객체를 생성해야 할 때.
- 객체 타입이 확장 가능해야 할 때:
- 새로운 객체 유형을 추가하거나 기존 객체 유형을 교체할 가능성이 있을 때.
- 객체 생성과 사용을 분리하고 싶을 때:
- 클라이언트 코드에서 객체 생성 과정을 분리하고 싶을 때.