단순 팩토리 패턴
단일 팩토리 객체가 특정 유형의 객체 인스턴스를 생성합니다. 동일 계열 객체 생성을 위한 패턴으로, 입력 파라미터에 따라 서로 다른 객체를 반환합니다.
장점: 복잡한 생성 로직 없이 파라미터만으로 객체 획득 가능
단점: 객체 종류 증가 시 생성 로직이 복잡해지고 유지보수 어려움
적용 시기: 생성 객체 종류가 적고 생성 로직이 단순한 경우
function Employee(type, permissions) {
this.type = type;
this.permissions = permissions;
}
function createEmployee(role) {
const roles = {
systemAdmin: ["dashboard", "users", "permissions", "content"],
teamAdmin: ["dashboard", "users", "content"],
contentManager: ["dashboard", "content"]
};
return roles[role]
? new Employee(role, roles[role])
: new Employee("guest", ["dashboard"]);
}
const newEmployee = createEmployee("teamAdmin");
추상 팩토리 패턴
객체 생성 인터페이스를 제공하지만 직접 인스턴스를 생성하지 않고, 관련 객체 군을 생성합니다. 확장에는 열려 있고 수정에는 닫힌 구조를 지향합니다.
class SystemRole {
constructor(name, role, access) {
this.name = name;
this.role = role;
this.access = access;
}
greet() {
console.log(`${this.name}님, 환영합니다`);
}
displayData() {
throw new Error("추상 메서드 구현 필요");
}
}
class SystemAdmin extends SystemRole {
constructor(name) {
super(name, "systemAdmin", ["dashboard", "users", "permissions", "content"]);
}
displayData() {
console.log("시스템 관리자 대시보드");
}
addPermission() {}
}
class ContentManager extends SystemRole {
constructor(name) {
super(name, "contentManager", ["dashboard", "content"]);
}
displayData() {
console.log("콘텐츠 관리자 대시보드");
}
}
function getRoleClass(roleType) {
const roleMap = {
systemAdmin: SystemAdmin,
teamAdmin: TeamAdmin,
contentManager: ContentManager
};
return roleMap[roleType] || (() => { throw new Error("유효하지 않은 역할") });
}
const RoleClass = getRoleClass("systemAdmin");
const adminUser = new RoleClass("김사원");
추상 팩토리의 핵심은 객체 생성 과정을 캡슐화하여 클라이언트 코드가 구체 클래스에 의존하지 않도록 하는 것입니다. 반환 형태(클래스/인스턴스)보다 결합도 감소가 더 중요한 목표입니다.