소프트 웨어 디자인 패턴 중 팩토리 관련하여 정리를 해보겠습니다.
Static Factory Method Pattern 은 결론부터 말했을때 생성자를 직접 사용하여 멤버 변수를 초기화 하지 않고 정적 메소드를 사용하여 인스턴스화 하는 디자인 패턴 입니다.
Factory 라는 이름이 붙은 이유는 마치 공장에서 상품을 생산하듯 Factory 메서드로 비슷한 객체를 찍어내듯이 동작을 하기 때문입니다.
우선 Factory Method Pattern을 코드로 예를 들어서 설명을 하겠습니다.
class Coffee {
constructor(name) {
this.name = name + '-' + Math.random();
}
makeInfo() {
console.log(`I am ${this.name}`);
}
}
class Latte extends Coffee {
constructor() {
super('Latte');
}
}
class Americano extends Coffee {
constructor() {
super('Americano');
}
}
class Mocha extends Coffee {
constructor() {
super('Mocha');
}
}
Coffee 라는 최 상위 클래스를 생성하고 그 아래 Coffee 타입인 Latte,Americano,Mocha 클래스를 생성한후 Coffee 클래스를 상속 받도록 하였습니다. 그리고 아래 코드와 같이 커피를 생상한 공장을 클래스화 하여 만들어 보겠습니다.
class CoffeeFactory {
create(type) {
switch (type) {
case 'Latte':
return new Latte();
case 'Americano':
return new Americano();
case 'Mocha':
return new Mocha();
default: {
console.log('Unknow Coffee Type');
}
}
}
}
const coffeeeFactory = new CoffeeFactory();
const latte = coffeeeFactory.create('Latte');
const americano = coffeeeFactory.create('Americano');
const mocha = coffeeeFactory.create('Mocha');
커피를 만들기 위한 공장인 CoffeeFactory 클래스를 만들고 create() 라는 메서드를 이용하여 인스턴스를 생성하였습니다. 그리고 위 코드를 실행 하였을때 아래 와 같은 실행 결과를 얻었습니다.
왜 latte,americano,mocha 인스턴스를 만들때 new 키워드를 사용하지않고 인스턴스를 생성을 하였을까 ?
자주 변경이 되는 부분과 독립적으로 데이터가 유지 되는 부분을 분리하려고 하기 때문입니다.
여기서 static 를 method 붙여주면 static factory method 패턴이 되는데 해당 디자인 패턴은 db 관리에 대한 코드를 작성할때 유용하게 사용됩니다.
class DatabaseManager {
constructor() {}
query() {}
static async BUILD(config) {
const config = await this.init(setttings);
return new DatabaseManager(config);
}
async init(settings) {}
async newMember() {}
}
const manager = DatabaseManager.BUILD(settings);
constructor 에서는 this 로 된 멤버 변수에 대한 비동기 접근이 불가능 하기 때문에 따로 초기화하는 메소드를 생성하여 환경 변수값을 초기화하는 class 코드를 작성하였습니다.
그리고 여기서 정적 변수를 사용하게 되면 내부 변수에 새 메모리 주소를 할당하지 않고도 값을 캐시 할수가 있어 초기 호출시에만 로딩시간이 걸리고 그 이후부터는 빠르게 접근이 가능합니다.
static factory pattern 은 양도 많고 테스트도 많이 해봐야 하는 패턴이라 아는 범위 내에서 글을 작성하였습니다.
'개발이야기 > Node.js' 카테고리의 다른 글
Event Emitter (0) | 2021.04.19 |
---|---|
macOS 에서 docker 로 redis 설치후 node.js 로 연동해기 (0) | 2021.04.18 |
Singleton Pattern (0) | 2021.04.12 |
Promise.all 과 Promise.race (0) | 2021.04.11 |
File_System (0) | 2021.04.11 |