Factory Method Pattern
View all Design Patterns
자식 클래스가 객체를 대신 생성하도록 로직을 제공하는 방식이다.
Class Diagram
이처럼 AnimalFactory
라는 추상 클래스로부터 생성하려는 Animal
클래스마다 별도의 Creator Factory를 구성해, 객체의 생성을 위임하게 된다. 외부에서 객체를 생성할 때는 팩토리 클래스로부터 create()
메소드를 호출해서 사용하면 된다.
Code
interface Animal {
sound(): string;
}
abstract class AnimalFactory {
create(): Animal {
const animal = this.createAnimal();
return animal;
}
/**
* This is the factory method. it delegates instantiate logic
* to subclass.
*/
protected abstract createAnimal(): Animal;
}
class DuckFactory extends AnimalFactory {
createAnimal(): Animal {
return new Duck();
}
}
class CatFactory extends AnimalFactory {
createAnimal(): Animal {
return new Cat();
}
}
class Duck implements Animal {
sound(): string {
return "Quack";
}
}
class Cat implements Animal {
sound(): string {
return "Meow";
}
}
// when client creates instances
const duckFactory = new DuckFactory();
const catFactory = new CatFactory();
const duck = duckFactory.create();
const cat = catFactory.create();
console.log(`duck sounds ${duck.sound()}`);
console.log(`cat sounds ${cat.sound()}`);
Pros and Cons
Pros
- Simple Factory Pattern이 가지는 OCP에 대한 한계를 해소할 수 있다.
- 새로운
Animal
객체를 추가할 경우, 간단히 팩토리 클래스를 추가하면 된다.const dogFactory = new DogFactory();
처럼 구성할 경우, 기존의AnimalFactory
및DuckFactory
,CatFactory
를 수정할 필요가 없다.
- 객체의 생성 과정을 캡슐화 하기 때문에, 어떻게 생성되는지에 대한 로직을 알 필요가 없다.
Cons
- 추상 팩토리 클래스, 팩토리 클래스 등 구현해야 할 코드가 다소 복잡해질 수 있다.