일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 호키도키
- hokeys
- react
- Svelte
- 이종호
- javascript
- 호키스
- hokidoki
- queue
- 자료구조
- 힛잇
- 개발
- 개발자
- 자스민
- data structure
- 리액트
- 스위프트
- Hitit
- 자바스크립트 자료구조
- 리액트 예제
- SWIFT
- 비동기
- 자바스크립트
- 계명대 이종호
- HTML
- 계명대
- TDD
- IOS
- 스벨트
- jest
Archives
- Today
- Total
Dog foot print
[GOF] 추상 팩토리 메서드 패턴 본문
추상화 팩토리 메서드
활용
같은 생성 방식을 가진 클래스군을 만들기 위해서 사용하는 패턴이다. 만약 생성 절차는 동일하지만, 전체 팩토리 교체를 통해 동일한 생산 방식을 따르며 서로 다른 제품을 생산 할 수 있게 한다.
참여 객체
- 추상 팩토리 : 팩토리의 산업 표준을 정의하여 생산 절차가 복잡한 제품을 만드는 데 필요한 인터페이스를 제공한다.
- 구체적인 팩토리 : 추상팩토리에서 정의한 인터페이스를 구현하고 구체적인 제품을 만든다.
- 추상 제품 : 팩토리가 만들 제품의 인터페이스를 정의한다.
- 구체적인 제품: 구체적인 팩토리가 만들 실제 제품을 나타낸다.
- 클라이언트 : 팩토리 전체에 생산 프로세스를 배치한다.
[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")
결론
추상화 팩토리를 잘 사용하기 위해서는 다음의 조건에 적합한지 봐야 할 듯하다.
- 동일한 인터페이스 혹은 같은 부모의 서브클래스를 사용 하려 할때
- 생성절차는 동일하지만 각 절차의 구현이 다른 경우
- 여러 객체를 하나의 객체군으로 취급하려 할 때.
- 객체의 생성 과정을 캡슐화 하고 싶을 때.
반응형
'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