Skip to main content

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(); 처럼 구성할 경우, 기존의 AnimalFactoryDuckFactory, CatFactory를 수정할 필요가 없다.
  • 객체의 생성 과정을 캡슐화 하기 때문에, 어떻게 생성되는지에 대한 로직을 알 필요가 없다.

Cons

  • 추상 팩토리 클래스, 팩토리 클래스 등 구현해야 할 코드가 다소 복잡해질 수 있다.
Related Links