빌더(builder) 패턴

목적

객체 생성에 관련된 패턴입니다.
객체의 생성 방법과 표현 방법을 분리하는 패턴입니다.

구조

설명

  • Director : Builer 의 multi interface 를 사용해서 제품을 생성
  • Builder : 복잡한 제품을 만들기 위해서 multi interface 사용 (Javascript 에서는 사용하지 않음)
  • ConcreteBuilder
    • Builder interface 로 구현
    • 새로 생성된 Product 를 검색
  • Product : 제품

코드 sample

  • Director : Shop
  • ConcreteBuilder : CarBuilder, TruckBuilder
  • Product : Car, Truck
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
function Shop() {
this.construct = function(builder) {
builder.step1();
builder.step2();
return builder.get();
}
}

function CarBuilder() {
this.car = null;

this.step1 = function() {
this.car = new Car();
};

this.step2 = function() {
this.car.addParts();
};

this.get = function() {
return this.car;
};
}

function TruckBuilder() {
this.truck = null;

this.step1 = function() {
this.truck = new Truck();
};

this.step2 = function() {
this.truck.addParts();
};

this.get = function() {
return this.truck;
};
}

function Car() {
this.doors = 0;

this.addParts = function() {
this.doors = 4;
};

this.say = function() {
log.add("I am a " + this.doors + "-door car");
};
}

function Truck() {
this.doors = 0;

this.addParts = function() {
this.doors = 2;
};

this.say = function() {
log.add("I am a " + this.doors + "-door truck");
};
}

// log helper
var log = (function () {
var log = "";
return {
add: function (msg) { log += msg + "\n"; },
show: function () { alert(log); log = ""; }
}
})();

function run() {
var shop = new Shop();
var carBuilder = new CarBuilder();
var truckBuilder = new TruckBuilder();
var car = shop.construct(carBuilder);
var truck = shop.construct(truckBuilder);

car.say();
truck.say();

log.show();
}

참조사이트

  • dofactory