Notice
Recent Posts
Recent Comments
Link
250x250
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 개발자부트캠프
- html
- react
- 알고리즘
- react-query
- #프로젝트캠프 #프로젝트캠프후기 #유데미 #스나이퍼팩토리 #웅진씽크빅 #인사이드아웃 #IT개발캠프 #개발자부트캠프 #리액트 #react #부트캠프 #리액트캠프
- ip
- 웅진씽크빅
- 리액트
- 메모리
- 네트워크
- 스나이퍼팩토리
- 인사이드아웃
- IT개발캠프
- CS
- 유데미
- 타입스크립트
- 자바스크립트
- App Runner
- BFS
- Algorithm
- 프로젝트캠프
- 해시
- 프로세스
- cs #네트워크
- 프로그래머스
- javascript
- React.js
- 스레드
- typescript
Archives
- Today
- Total
Bin's Blog
오늘의 CS(디자인 패턴 - 팩토리 패턴) 본문
728x90
1. 팩토리 패턴이란?
- 팩토리 패턴은 마치 공장에서 물건을 생성하는 것처럼, 객체를 생성하는 방법이다.
- 사용자가 원하는 객체를 쉽게 만들 수 있게 하는 것이 목적이다.
- 코드에서 객체 생성 부분을 떼어내 추상화한 패턴이자 상속 관계에 있는 두 클래스에서 상위 클래스가 중요한 뼈대를 결정하고, 하위 클래스에서 객체 생성에 관한 구체적인 내용을 결정하는 패턴이다.
- 상위 클래스와 하위 클래스가 분리되기 때문에 느슨한 결합을 가지며 상위 클래스에서는 인스턴스 생성 방식에 대해 전혀 알 필요가 없기 때문에 더 많은 유연성을 가지고 객체 생성 로직이 따로 떼어져 있어서 코드를 리팩터링해도 한 곳만 고치면 되니 유지 보수성이 증가한다.
- 예를 들어 친구들과 함께 학교에서 간식을 먹고 싶다. 간식 종류가 너무 많아서 어떤 간식을 먹을지 고민인데 학교에서 운영하는 간식 팩토리가 있다고 생각해보자. 간식 팩토리는 간식을 주문 받아 만들어준다. 내가 먹고 싶은 간식의 종류를 말해주면 그 종류에 맞는 간식을 만들어준다. 이렇게 팩토리 패턴을 사용하면, 객체를 만드는 방법을 숨기고 원하는 객체를 쉽게 만들어 사용할 수 있다.
- 예를 하나 더 들면 밀크티 레시피, 버블티 레시피, 아메리카노 레시피라는 구체적인 내용이 들어 있는 하위 클래스가 컨베이어벨트 를 통해 전달되고, 상위 클래스인 커피 팩토리에서 이 레시피들을 토대로 우유 등을 생산하는 생산 공정을 생각하면 된다.
2. 팩토리 패턴 구현
const num = new Object(17);
const str = new Object("a");
// Number
num.constructor.name;
// String
str.constructor.name;
- 숫자를 전달하거나 문자열을 전달함에 따라 다른 타입의 객체가 생성된다. 전달받은 값에 따라 다른 객체를 생성하고 인스턴스 타입 등을 정한다.
class MilkTea {
constructor() {
this.name = "milktea"
}
};
class BubbleTea {
constructor() {
this.name = "bubbletea"
}
};
class Americano {
constructor() {
this.name = "americano"
}
};
class MilkFactory {
static createCoffee() {
return new MilkTea()
}
};
class BubbleFactory {
static createCoffee() {
return new BubbleTea()
}
};
class AmericanoFactory {
static createCoffee() {
return new Americano()
}
};
const factoryList = { MilkFactory, BubbleFactory, AmericanoFactory };
class CoffeeFactory {
static createCoffee(type) {
const factory = factoryList[type];
return factory.createCoffee();
}
};
const main = () => {
// 밀크티 주문
const milk = CoffeeFactory.createCoffee("MilkFactory")
// milktea
console.log(milk.name)
};
main();
- 위에 CoffeeFactory에서 상위 클래스가 중요한 뼈대를 결정하고 하위 클래스인 MilkFactory가 구체적인 내용을 결정하고 있다.
- 이는 전에 싱글 팩토리에서 봤던 의존성 주입이라고도 볼 수 있다. CoffeeFactory에서 MilkFactory의 인스턴스를 생성하는 것이 아닌 MilkFactory에서 생성한 인스턴스를 CoffeeFactory에 주입하고 있다.
- CoffeFactory 클래스를 보면 static 키워드를 통해 createCoffee() 메서드를 정적메서드를 선언했는데 이렇게 정적 메서드로 정의하면 클래스 기반으로 객체를 만들지 않고 호출이 가능하고, 해당 메서드에 대한 메모리 할당을 한 번만 할 수 있다는 장점이 있다.
- 예를 들어, 학교에서 선생님이 학생들에게 무언가를 가르치는 상황을 생각해보자. 학생들은 독립된 객체로 생각하고, 선생님은 클래스이다. 학생들에게 특별한 것을 가르치지 않고, 모든 학생들에게 동일한 것을 가르칠 때 선생님이 직접 가르친다. 이때 선생님의 가르침이 정적 메서드라고 생각할 수 있다. 왜냐면 모든 학생들에게 공통적으로 필요한 것이기 때문이다. 이렇게 정적 메서드를 사용하면 각 학생들에게 개별적으로 가르칠 필요가 없어져 메모리를 아낄 수 있다.
- 정적 메서드는 인스턴스의 상태를 변경하거나 참조하는 것이 아니라, 클래스 전체와 관련된 공통적인 동작을 수행한다. 객체의 인스턴스에 대한 정보가 필요하지 않은 상황에서 사용된다.
728x90
'CS' 카테고리의 다른 글
오늘의 CS(디자인 패턴 - 프록시 서버) (0) | 2023.05.08 |
---|---|
오늘의 CS(디자인 패턴 - 프록시 패턴) (0) | 2023.05.08 |
오늘의 CS(디자인 패턴 - 옵저버 패턴) (0) | 2023.05.05 |
오늘의 CS(디자인 패턴 - 전략 패턴) (0) | 2023.05.04 |
오늘의 CS(디자인 패턴 - 싱글톤 패턴) (0) | 2023.05.02 |