디자인 패턴 3. Factory Pattern, 팩토리 패턴
디자인 패턴
팩토리 패턴이란?
객체를 사용하는 코드에서 객체 생성 부분을 떼어내 추상화하는 패턴이자 상속 관계에 있는 두 클래스에서 상위 클래스가 중요한 뼈대를 결정하고, 하위 클래스에서 객체 생성에 관한 구체적인 내용을 결정하는 패턴이다.
장점
- 상위 클래스와 하위 클래스가 분리되어 느슨한 결합을 가지지만 상위 클래스에서는 인스턴스 생성 방식에 대해 전혀 알 필요가 없기 때문에 많은 유연성을 갖게 된다.
- 객체 생성 로직이 따로 떼어져 있기 때문에 코드 리팩토링 하더라도 한 곳만 고칠 수 있게 되니 유지 보수성이 증가한다.
팩토리 패턴 예제
function Person(name) { this.name = name this.introduce = function() { return 'My name is' + this.name } } // name 프로퍼티와 introduce 메소드를 미리 초기화한 객체를 리턴합니다. var user1 = new Person('godori') var user2 = new Person('irodog') user1.introduce() // My name is godori user2.introduce() // My name is irodog
팩토리 패턴 응용 JavaScript Factory Function
예제 1
class Animal { speak() {} } class Cat extends Animal { speak() { console.log("meow!"); } } class Dog extends Animal { speak() { console.log("wang!"); } } class FactoryAnimal { creatAnimal(type) { if(type =='cat') return new Cat() if(type =='dog') return new dog() } } cat = FactoryAnimal.creatAnimal('cat') cat.speak() // meow! dog = FactoryAnimal.creatAnimal('dog') dog.speak() // wang!
예제 2
class Car{ constructor(info){ this.name = info.name; this.price = info.price; } getInfo(){ return this.name+"의 가격은 "+this.price+" 입니다."; } static factory(name){ if(name === "Avante"){ return new Avante(); }else if(name === "Sonata"){ return new Sonata(); } } } class Sonata extends Car{ constructor(){ super({name: "쏘나타", price: "2,386 ~ 3,367만원"}); } } class Avante extends Car{ constructor(){ super({name: "아반테", price: "1,570 ~ 2,453만원"}); } } const avante = Car.factory("Avante"); const sonata = Car.factory("Sonata"); avante.getInfo() // 아반테의 가격은 "1,570 ~ 2,453만원" 입니다. sonata.getInfo()// 쏘나타의 가격은 "2,386 ~ 3,367만원" 입니다."
예제 3
class CafeLatte { constructor() { this.price = 3000; } getPrice() { return this.price; } } class CaramelLatte { constructor() { this.price = 5000; } getPrice() { return this.price; } } class LatteFactory() { static create(latteType) { if(latteType === 'cafe') { return new CafeLatte(); } else if(latteType === 'caramel') { return new CaramelLatte(); } } } let latte = LatteFactory.create('caramel'); latte.getPrice(); // 5000