팩토리 패턴이란?
Factory 패턴은 객체를 명시적으로 구체적인 클래스를 지정하지 않고 생성하는 방법을 제공하는 생성 패턴입니다. Factory 클래스내에서 객체 생성 로직을 캡슐화하여 공통 인터페이스를 통해 관련 객체의 인스턴스를 생성할 수 있습니다. 즉 상위 클래스가 중요한 뼈대를 결정하고, 하위 클래스에서 객체 생성에 관한 구체적인 내용을 결정하는 패턴이다.
이를 통해 느슨한 결합을 가지며 상위 클래스에서는 인스턴스 생성 방식에 대해 전혀 알 필요가 없기 때문에 더 많은 유연성을 갖게 됩니다. 그리고 객체 생성 로직이 따로 분리되어 있기 때문에 코드 리팩터링할때 한 곳만 고치면 되니 유지보수성이 증가됩니다.
자바스크립트 클래스를 통한 팩토리 패턴 대표적인 예 코드
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
class Latte {
constructor() {
this.name = "latte"
}
}
class Espresso {
constructor() {
this.name = "espresso"
}
}
// 위의 코드는 Latte와 Espresso라는 두 개의 클래스를 정의합니다.
// 각 클래스는 생성자를 가지고 있으며, name 속성을 초기화합니다.
class LatteFactory {
static createCoffee() {
return new Latte()
}
}
class EspressoFactory {
static createCoffee() {
return new Espresso()
}
}
// 위의 코드는 LatteFactory와 EspressoFactory라는 두 개의 팩토리 클래스를 정의합니다.
// 각각의 팩토리 클래스는 createCoffee라는 정적 메서드를 가지고 있습니다.
// 이 메서드는 해당하는 커피 객체를 생성하여 반환합니다.
const factoryList = { LatteFactory, EspressoFactory }
// 위의 코드는 LatteFactory와 EspressoFactory를 포함하는 factoryList라는 객체를 정의합니다.
// 이 객체는 나중에 커피를 생성할 때 사용됩니다.
class CoffeeFactory {
static createCoffee(type) {
const factory = factoryList[type]
return factory.createCoffee()
}
}
// 위의 코드는 CoffeeFactory라는 팩토리 클래스를 정의합니다.
// 이 클래스에는 createCoffee라는 정적 메서드가 있습니다.
// 이 메서드는 type 매개변수를 받아 해당하는 팩토리 클래스를 찾고,
// 해당 팩토리의 createCoffee 메서드를 호출하여 커피 객체를 생성하여 반환합니다.
const main = () => {
const coffee = CoffeeFactory.createCoffee('LatteFactory')
console.log(coffee.name)
}
// 이 함수에서 CoffeeFactory를 사용하여 LatteFactory를 지정한 커피 객체를 생성하고, 생성된 커피 객체의 name 속성을 출력
main();
|
cs |
정적 메소드를 사용하면 클래스의 인스턴스 없이 호출이 가능하여 메모리를 절약할 수 있고 개별 인스턴스에 묶이지 않으며 클래스 내의 함수를 정의할 수 있는 장점이 있습니다.
자바스크립트 함수를 통한 팩토리 패턴 대표적인 예 코드
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
31
32
33
34
35
36
37
38
39
40
41
42
43
|
// 팩토리 함수 정의
function createCar(type) {
let car;
// 지정된 타입에 따라 새로운 객체 생성
if (type === 'sedan') {
car = new Sedan();
} else if (type === 'suv') {
car = new SUV();
} else if (type === 'sports') {
car = new SportsCar();
}
// 공통 인터페이스
car.start = function() {
console.log(`${type} 자동차를 시작합니다.`);
};
return car;
}
// 다양한 자동차 클래스 정의
function Sedan() {
// 세단에 특화된 속성과 메서드
}
function SUV() {
// SUV에 특화된 속성과 메서드
}
function SportsCar() {
// 스포츠카에 특화된 속성과 메서드
}
// 사용 예시
const sedan = createCar('sedan');
sedan.start(); // 출력: "세단 자동차를 시작합니다."
const suv = createCar('suv');
suv.start(); // 출력: "SUV 자동차를 시작합니다."
const sportsCar = createCar('sports');
sportsCar.start(); // 출력: "스포츠카를 시작합니다."
|
cs |
위 예시에서 createCar 함수는 팩토리 함수로 동작하며 type 매개변수를 받아 해당 타입에 기반한 객체를 반환합니다. 팩토리 함수는 객체 생성 프로세스를 캡슐화하고 적절한 자동차 클래스 (Sedan, SUV, SportsCar)의 인스턴스를 반환합니다.
팩토리 함수로 생성된 각 자동차 객체는 start 메소드를 가지며, 이는 자동차 유형에 대한 공통 인터페이스를 나타냅니다. 자동차 클래스의 구체적인 구현은 각 생성자 함수인 Sedan, SUV, SportCar 내부에 숨겨져 있습니다. 이렇게 구현 세부 사항을 노출시키지 않고 다양한 유형의 자동차 객체를 손쉽게 생성할 수 있습니다.
'CS' 카테고리의 다른 글
이터레이터 패턴 ( Iterator Pattern ) (0) | 2023.06.29 |
---|---|
프록시 패턴 ( Proxy Pattern ) (0) | 2023.06.25 |
옵저버 패턴 ( Observer Pattern ) (0) | 2023.06.24 |
전략 패턴 ( Strategy pattern ) (0) | 2023.06.24 |
싱글톤 패턴 ( Singleton Pattern ) (1) | 2023.06.14 |