해당 포스팅은 Javascript Design Patterns 포스팅 에서 번역하였습니다.
팩토리패턴은 클래스 기반의 생성 패턴중 또 다른 패턴입니다. 여기서는 객체를 인스턴스화 하는 책임을 하위 클래스에 위임하는 인터페이스를 제공합니다.
팩토리패턴은 서로 다르지만 유사한 특성을 가진 객체들을 관리하거나 조작해야 할 때 자주 사용됩니다.
class BallFactory {
constructor() {
this.createBall = function(type) {
let ball;
if (type === 'football' || type === 'soccer') ball = new Football();
else if (type === 'basketball') ball = new Basketball();
ball.roll = function() {
return `The ${this._type} is rolling.`;
};
return ball;
};
}
}
class Football {
constructor() {
this._type = 'football';
this.kick = function() {
return 'You kicked the football.';
};
}
}
class Basketball {
constructor() {
this._type = 'basketball';
this.bounce = function() {
return 'You bounced the basketball.';
};
}
}
// creating objects
const factory = new BallFactory();
const myFootball = factory.createBall('football');
const myBasketball = factory.createBall('basketball');
console.log(myFootball.roll()); // The football is rolling.
console.log(myBasketball.roll()); // The basketball is rolling.
console.log(myFootball.kick()); // You kicked the football.
console.log(myBasketball.bounce()); // You bounced the basketball.
위의 예제에서는 매개변수를 사용하는 메서드가 있는 BallFactory라는 팩토리 클래스를 만들고, 매개 변수에 따라 객체를 인스턴스화 하는 책임을 해당 클래스에 위임하도록 합니다. type의 매개변수가 football
또는 soccer
인 경우 객체의 인스턴스화는 Football 클래스에서 처리하지만, basketball
인 경우에는 Basketball 클래스에서만 처리하며, BallFactory는 이에대한 클래스 생성만 위임하는 역할을 합니다.