자바스크립트 팩토리 패턴 구현

단순 팩토리 패턴

단일 팩토리 객체가 특정 유형의 객체 인스턴스를 생성합니다. 동일 계열 객체 생성을 위한 패턴으로, 입력 파라미터에 따라 서로 다른 객체를 반환합니다.

장점: 복잡한 생성 로직 없이 파라미터만으로 객체 획득 가능
단점: 객체 종류 증가 시 생성 로직이 복잡해지고 유지보수 어려움
적용 시기: 생성 객체 종류가 적고 생성 로직이 단순한 경우

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("김사원");

추상 팩토리의 핵심은 객체 생성 과정을 캡슐화하여 클라이언트 코드가 구체 클래스에 의존하지 않도록 하는 것입니다. 반환 형태(클래스/인스턴스)보다 결합도 감소가 더 중요한 목표입니다.

태그: JavaScript 디자인패턴 팩토리패턴 객체생성 역할기반접근제어

8월 5일 01:44에 게시됨