Dog foot print

[GOF] 추상 팩토리 메서드 패턴 본문

Architecture

[GOF] 추상 팩토리 메서드 패턴

개 발자국 2021. 10. 23. 15:12

추상화 팩토리 메서드

활용

같은 생성 방식을 가진 클래스군을 만들기 위해서 사용하는 패턴이다. 만약 생성 절차는 동일하지만, 전체 팩토리 교체를 통해 동일한 생산 방식을 따르며 서로 다른 제품을 생산 할 수 있게 한다.

참여 객체

  1. 추상 팩토리 : 팩토리의 산업 표준을 정의하여 생산 절차가 복잡한 제품을 만드는 데 필요한 인터페이스를 제공한다.
  2. 구체적인 팩토리 : 추상팩토리에서 정의한 인터페이스를 구현하고 구체적인 제품을 만든다.
  3. 추상 제품 : 팩토리가 만들 제품의 인터페이스를 정의한다.
  4. 구체적인 제품: 구체적인 팩토리가 만들 실제 제품을 나타낸다.
  5. 클라이언트 : 팩토리 전체에 생산 프로세스를 배치한다.

[image:1A58DCCB-066E-4AE6-B22E-56E6E7D4B8F7-75143-000796B57C61B2DA/2021-10-17_15-44-59.png]

코드 예시

만들고 싶은 product

interface HokeysButtonInterface extends HTMLButtonElement {
    textSet(text: string)
}

class HokeysButton extends HTMLButtonElement implements HokeysButtonInterface {
    textSet(text: string) {
        this.value = text
    }
}

제품의 구성요소를 만들어내는 팩토리

enum BorderStyle {
    dashed = "dashed",
    solid = "solid"
}

type RectSize = { top: number, right: number, bottom: number, left: number }
type CompactBorderStyle = { width: number, style: BorderStyle, color: string }


interface ButtonFactory {
      makeButton(): HokeysButton
    makeBackground(): string
    makePadding(): RectSize
    makeBorder(): CompactBorderStyle
}


class ModalButtonFactory implements ButtonFactory {
    makeButton() {
        return new HokeysButton()
    }

    makeBackground() {
        return "white"
    }

    makePadding() {
        return { top: 5, right: 5, bottom: 5, left: 5 }
    }

    makeBorder() {
        return {
            width: 1,
            style: BorderStyle.solid,
            color: "gray"
        }
    }
}

class LoginButtonFactory implements ButtonFactory {
    makeButton() {
        return new HokeysButton()
    }

    makeBackground() {
        return "black"
    }

    makePadding() {
        return { top: 10, right: 10, bottom: 10, left: 10 }
    }

    makeBorder() {
        return {
            width: 1,
            style: BorderStyle.dashed,
            color: "black"
        }
    }
}

요청에 따라 조립을 하는 클라이언트

class ButtonClient {
    buildButton(factory: ButtonFactory): HokeysButtonInterface {
        const button = factory.makeButton()
        const background = factory.makeBackground()
        const { top, right, bottom, left } = factory.makePadding()
        const { width, style, color } = factory.makeBorder()

        button.style.background = background
        button.style.padding = `${top} ${right} ${bottom} ${left}`
        button.style.border = `${width} ${style} ${color}`
        return button
    }
}

각 버튼의 스타일을 조립 요청

const btnClient = new ButtonClient()

const loginButton = btnClient.buildButton(new LoginButtonFactory())
const acceptButton = btnClient.buildButton(new ModalButtonFactory())

loginButton.textSet("Login")
acceptButton.textSet("Confirm")

결론

추상화 팩토리를 잘 사용하기 위해서는 다음의 조건에 적합한지 봐야 할 듯하다.

  1. 동일한 인터페이스 혹은 같은 부모의 서브클래스를 사용 하려 할때
  2. 생성절차는 동일하지만 각 절차의 구현이 다른 경우
  3. 여러 객체를 하나의 객체군으로 취급하려 할 때.
  4. 객체의 생성 과정을 캡슐화 하고 싶을 때.
반응형

'Architecture' 카테고리의 다른 글

[GOF] 싱글톤 패턴  (0) 2021.10.31
[GOF] Builder 패턴  (0) 2021.10.23
[GOF] 팩토리 메서드 패턴  (0) 2021.10.17
[Architecture] S.O.L.I.D [D]  (0) 2021.05.13
[Architecture] S.O.L.I.D [I]  (0) 2021.05.11
Comments