추상팩토리(Abstractfactory) 패턴
목적
객체 생성에 관련된 패턴입니다.
서로 관련성이 있는 다양한 객체를 생성하기 위한 인터페이스를 제공하는 패턴입니다.
구조
설명
- AbstractFatory : Product 생성하기 위한 인터페이스만 정의 (Javascript 에서는 사용하지 않음)
- ConcreateFactory : creatProduct() 로 새로운 product 를 return 해준다
- Product : Factory 에 의해서 생성되는 product
- AbstractProduct : product 의 인터페이스 (Javascript 에서는 사용하지 않음)
코드 sample 1
- ConcreateFactory : EmployeeFactory, VendorFactory
- Product : Employee, Vendor
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
55function Employee(name) {
this.name = name;
this.say = function () {
log.add("I am employee " + name);
};
}
function EmployeeFactory() {
this.create = function(name) {
return new Employee(name);
};
}
function Vendor(name) {
this.name = name;
this.say = function () {
log.add("I am vendor " + name);
};
}
function VendorFactory() {
this.create = function(name) {
return new Vendor(name);
};
}
// log helper
var log = (function () {
var log = "";
return {
add: function (msg) { log += msg + "\n"; },
show: function () { alert(log); log = ""; }
}
})();
function run() {
var persons = [];
var employeeFactory = new EmployeeFactory();
var vendorFactory = new VendorFactory();
persons.push(employeeFactory.create("Kim"));
persons.push(employeeFactory.create("Lee"));
persons.push(vendorFactory.create("Samsung"));
persons.push(vendorFactory.create("LG"));
for (var i = 0, len = persons.length; i < len; i++) {
persons[i].say();
}
log.show();
}
코드 sample 2
- ConcreateFactory : vehicleFactory
- Product : Car, Truck, Bike
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23function Car() { this.name = "Car"; this.wheels = 4; }
function Truck() { this.name = "Truck"; this.wheels = 6; }
function Bike() { this.name = "Bike"; this.wheels = 2; }
const vehicleFactory = {
createVehicle: function (type) {
switch (type.toLowerCase()) {
case "car":
return new Car();
case "truck":
return new Truck();
case "bike":
return new Bike();
default:
return null;
}
}
};
const car = vehicleFactory.createVehicle("Car"); // Car { name: "Car", wheels: 4 }
const truck = vehicleFactory.createVehicle("Truck"); // Truck { name: "Truck", wheels: 6 }
const bike = vehicleFactory.createVehicle("Bike"); // Bike { name: "Bike", wheels: 2 }
const unknown = vehicleFactory.createVehicle("Boat"); // null ( Vehicle not known )
참조사이트
- dofactory