GoF์˜ ๋””์ž์ธ ํŒจํ„ด, ๊ฐ€๊ต ํŒจํ„ด์— ๋Œ€ํ•ด ์•Œ์•„๋ณธ๋‹ค.

ํ•ด๋‹น ๊ธ€์€, ๋‹ค์Œ์˜ ์ฝ”๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ์š”์•ฝ

  • ๊ธฐ๋Šฅ๊ณผ ๊ตฌํ˜„์˜ ๋ถ„๋ฆฌ๋ฅผ ํ†ตํ•ด ์‹œ์Šคํ…œ์˜ ํ™•์žฅ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ด๋Š” ํŒจํ„ด
  • ๊ธฐ์กด ์‹œ์Šคํ…œ์— ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด๋„ ์–ด๋– ํ•œ ๋ณ€๊ฒฝ๋„ ์—†์ด ์ถ”๊ฐ€๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ํŠน์ • ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ ธ์•ผ ํ•˜๋Š” ๊ตฌํ˜„์„, ์ธ์ž์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ๋ฐ›์•„์„œ ๋™์ž‘์„ ์š”์ฒญํ•˜์—ฌ ํ™•์žฅ์„ฑ์„ ์ œ๊ณ ํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ๋‘๊ฐœ์˜ ๊ฐœ๋…์ด ๋…๋ฆฝ์ ์œผ๋กœ ํ™•์žฅ๋˜๋ฉด์„œ ์„œ๋กœ์—๊ฒŒ ์—ฐ๊ด€์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ƒ๊ฐํ•ด๋ณผ๋งŒ ํ•จ

์„ค๋ช…

  • ๊ธฐ๋Šฅ ๊ณ„์ธต
    • ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์œ„ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค๋“ค
  • ๊ตฌํ˜„ ๊ณ„์ธต
    • ์ด๋ฏธ ์ •ํ•ด์ง„ ์ธํผํŽ˜์ด์Šค์— ๋Œ€ํ•œ ๊ตฌํ˜„ ํด๋ž˜์Šค๋“ค

์ด ๋‘ ๊ณ„์ธต ์‚ฌ์ด์— ๋‹ค๋ฆฌ๋ฅผ ๋†“๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์˜ ํŒจํ„ด์„ ๊ฐ€๊ต ํŒจํ„ด์ด๋ผ ํ•œ๋‹ค.

์˜ˆ์‹œ

์ฒซ๋ฒˆ์งธ

  • Draft๋Š” ์•„์ง ์ถœ๊ฐ„๋˜์ง€ ์•Š์€ ๊ธ€์„ ๋งํ•จ
  • ํ•ด๋‹น Draft๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด Display interface๋ฅผ ์ฑ„ํƒํ•˜๊ณ  ์žˆ๋Š” ๊ตฌํ˜„์ฒด๋ฅผ ๋ฐ›์Œ
  • Draft ๊ตฌํ˜„์ฒด๋Š” ์ด Display ๊ตฌํ˜„์ฒด์— ์š”์ฒญํ•˜์—ฌ ์‹ค์งˆ์ ์œผ๋กœ ์ถœ๋ ฅ์„ ์š”์ฒญํ•จ
  • ๋งŒ์•ฝ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ถœ๋ ฅํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, Display ๋ฅผ ์ฑ„ํƒํ•œ ๋‹ค๋ฅธ ๊ตฌํ˜„์ฒด๋ฅผ ๋„ฃ์–ด๋ฒ„๋ฆฌ๋ฉด ๋จ
  • ์ด๋Ÿฌํ•œ ์ ์—์„œ ๊ตฌํ˜„์ด ๋…๋ฆฝ๋˜์–ด ์žˆ๋‹ค๋Š” ์ ์„ ์•Œ ์ˆ˜ ์žˆ์Œ
    let draft = Draft(title: "๋น„ํŠธ์ฝ”์ธ์€ ๋ฌด์—‡์ธ๊ฐ€",
                      author: "์ตœ์™„์‹",
                      contents: ["์‚ฌํ† ์‹œ", "์‚ฌ์นด๋ชจํ† ", "์•”ํ˜ธํ™”ํ"])
 
    // ์ถœ๋ ฅ์„ ๋‹ด๋‹นํ•˜๋Š” ๊ตฌํ˜„์ฒด๋ฅผ ๋„ฃ์–ด์คŒ
    let simpleDisplay = SimpleDisplay()
 
    // ์‹ค์งˆ์ ์ธ ๊ตฌํ˜„์€ Display๊ฐ€ ํ•˜๊ณ  ์žˆ์Œ
    draft.describe(display: simpleDisplay)
 
    // ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ถœ๋ ฅํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•œ ๋…€์„์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋จ
    let captionDisplay = CaptionDisplay()
 
    draft.describe(display: captionDisplay)

๋‘๋ฒˆ์งธ

  • ์ด ์ƒํ™ฉ์—์„œ ์š”๊ตฌ์‚ฌํ•ญ์ด ์ถ”๊ฐ€๋˜์—ˆ์„ ๋•Œ ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€ ๋ณด์ž.
  • Publication ๊ฐ์ฒด๋Š” Draft๋ฅผ ์ƒ์†๋ฐ›์•„ ์ถœํŒ์‚ฌ, ๊ฐ€๊ฒฉ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค.
  • ๊ทธ๋Ÿฌ๋ฉด์„œ ๊ธฐ์กด์˜ Draft๊ฐ€ ๊ฐ€์ง€๋Š” ๊ธฐ๋Šฅ์€ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค.
  • Draft์˜ ๊ธฐ๋Šฅ์€ ํ•ต์‹ฌ์ด๊ณ , ์ถ”๊ฐ€์ ์œผ๋กœ ๋‹ฌ๋ผ๋ถ™๋Š” ๊ฒƒ์€ ๋ถ€๊ฐ€์ ์ด๋ผ ์ƒ๊ฐํ•ด๋ณด์ž.
  • ์ด๋Ÿฐ ๊ฒฝ์šฐ, Draft์— ๋งž์ถฐ์ ธ ์žˆ๋Š” ๊ธฐ๋Šฅ์€ ๊ทธ๋Œ€๋กœ ๋‘” ์ƒํƒœ์—์„œ, ๋ถ€๊ฐ€์ ์ธ ๋ถ€๋ถ„๋งŒ ์ถœ๋ ฅํ•  ๋•Œ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.
    // Publication
    let publication = Publication(title: "๋‚˜๋„ ์ฑ… ์“ธ ์ˆ˜ ์žˆ๋‹ค",
                                  author: "์ตœ์™„์‹",
                                  contents: ["์•ผ", "๋„ˆ๋„", "์ฑ… ์“ธ ์ˆ˜ ์žˆ์–ด"],
                                  publisher: "๋™์•„์ถœํŒ",
                                  cost: 39000)
 
    // display ๊ฐ์ฒด๋„ ์žฌํ™œ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
    publication.describe(display: captionDisplay)
 
internal class Publication: Draft {
 
    internal let publisher: String
    internal let cost: Int
 
    internal init(title: String,
                           author: String,
                           contents: [String],
                           publisher: String,
                           cost: Int) {
        self.publisher = publisher
        self.cost = cost
 
        super.init(title: title,
                   author: author,
                   contents: contents)
    }
 
    private func describePublicationInfo() {
        print("# \(self.publisher)  $ \(cost)")
    }
 
    // ๊ธฐ๋ณธ Draft์˜ ๊ธฐ๋Šฅ์€ ๋˜‘๊ฐ™์ด ์œ ์ง€ํ•˜๋ฉด์„œ, ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ๊ฐ€์ง€๋Š”
    // ์ถ”๊ฐ€์ ์ธ ํŠน์ง•๋งŒ์„ ๋„ฃ์—ˆ์Œ
    internal override func describe(display: Display) {
        super.describe(display: display)
 
        self.describePublicationInfo()
    }
}

๋‹ค๋ฅธ ์ด๋ฆ„

  • Handle/Body(ํ•ธ๋“ค/๊ตฌํ˜„๋ถ€)

๋™๊ธฐ

  • ํ•˜๋‚˜์˜ ์ถ”์ƒ์  ๊ฐœ๋…(Display)์ด ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ตฌํ˜„(SimpleDisplay)์œผ๋กœ ๋‚˜์˜ฌ ๊ฒฝ์šฐ ๋Œ€๋ถ€๋ถ„์€ ์ƒ์†์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • ํ•˜์ง€๋งŒ ์ƒ์†์€ ์ถฉ๋ถ„ํ•œ ์œตํ†ต์„ฑ์„ ๊ฐ€์ง€๊ธฐ ์–ด๋ ต๋‹ค.
  • ์ƒ์†์€ ๊ตฌํ˜„๊ณผ ์ถ”์ƒ์  ๊ฐœ๋…์„ ์˜๊ตฌ์ ์œผ๋กœ ์ข…์†์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ถ”์ƒ์  ๊ฐœ๋…๊ณผ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์ˆ˜์ •, ํ™•์žฅํ•˜๊ธฐ ์–ด๋ ต๋‹ค.

  • ํ™”๋ฉด์— ๋‹ค์–‘ํ•œ ์š”์†Œ๋ฅผ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋Š” Window ํด๋ž˜์Šค๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž.
  • A, B, C ํ”Œ๋žซํผ ๋ชจ๋‘ ๊ฒฐ๊ตญ Window ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ ๊ทธ๋ฆฌ๊ณ ์žํ•˜๋Š” ํ–‰์œ„๋Š” ๋™์ผํ•˜๋‹ค.
  • ํ•˜์ง€๋งŒ ๊ตฌํ˜„์€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.
  • ์ด๋Ÿฌํ•œ ์ ์—์„œ ์ƒ์†์„ ์‚ฌ์šฉํ•ด๋ณด์ž.
  • ์ดˆ๊ธฐ AWindow, BWindow, CWindow๋ฅผ ๋งŒ๋“œ๋Š”๋ฐ๋Š” ํฐ ๋ฌธ์ œ๊ฐ€ ์•ˆ์ƒ๊ธด๋‹ค.
  • ๊ทธ๋Ÿฐ๋ฐ, ๋งŒ์•ฝ IconWindow๋ผ๋Š”๊ฒŒ ์ƒ๊ฒผ๋‹ค.
  • ์ผ๋‹จ ์ด๋…€์„๋„ Window๋‹ˆ, Window๋ฅผ ์ƒ์†ํ•ด์„œ ๋งŒ๋“ค์—ˆ๋‹ค.
  • ๊ทธ๋Ÿฐ๋ฐ, A, B ๋ชจ๋‘์—์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ๊นจ๋‹ฌ์•˜๋‹ค.
  • ์ด๋ ‡๊ฒŒ ๋˜๋ฉด IconWindow๋ฅผ ์ƒ์†ํ•ด์„œ ๊ฐ๊ฐ์˜ ํ”Œ๋žซํผ์— ๋งž๋Š” ๊ตฌํ˜„์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.
  • IconWindow์ด์™ธ์— ๋‹ค๋ฅธ ๋…€์„๋“ค๋„ ๋ง‰ ์ถ”๊ฐ€๋œ๋‹ค๋ฉด ์–ด๋–จ๊นŒ? ์ง€์˜ฅ์ด ์‹œ์ž‘๋œ๋‹ค.
  • ์ฆ‰, ํŠน์ •ํ•œ ๊ตฌํ˜„์ด ๋ฐœ์ƒํ•œ๋‹ค. ์ฝ”๋“œ๊ฐ€ ํ”Œ๋žซํผ์— ์ข…์†๋œ๋‹ค.
  • ์œˆ๋„์šฐ ๊ตฌํ˜„๋งŒ ์ข…์†์ ์ด๋ฉด ๋˜๋Š”๋ฐ, ๋‚˜๋จธ์ง€ ์ฝ”๋“œ๊นŒ์ง€ ์ข…์†๋˜๊ฒŒ ๋œ๋‹ค.

  • ์ด๋Ÿฐ ๊ฒฝ์šฐ, ๊ตฌํ˜„์ฒด๋ฅผ ๋„ฃ์–ด ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ฆ‰, ์™ผ์ชฝ์— ์œ„์น˜ํ•œ ๊ธฐ๋Šฅ ๊ณ„์ธต์—์„œ๋Š” ๊ณตํ†ต๋œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ๋„ฃ๊ณ ,
  • ์‹ค์งˆ์ ์œผ๋กœ ๋™์ž‘์€ ๊ตฌํ˜„์ฒด๋ฅผ ๋„ฃ์–ด ๋™์ž‘์„ ๋Œ๋ ค๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์ด๋‹ค.
  • ์ž˜ ๋ณด๋ฉด, IconWindow์˜ ๊ฒฝ์šฐ Drawborder๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด ์‹ค์งˆ ๋™์ž‘์€
  • WindowImp์˜ ๊ตฌํ˜„์ฒด๋ฅผ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ๋‹ค. ๊ฐ ํ”Œ๋žซํผ์— ๋งž๋Š” ๊ตฌํ˜„์ฒด๋ฅผ ๋„ฃ์œผ๋ฉด ๋๋‚˜๋Š” ๊ฒƒ์ด๋‹ค.
  • ์ฆ‰, ๊ฐ ํ”Œ๋žซํผ์— ๋”ฐ๋ผ ๋‹ฌ๋ฆฌ ๋งŒ๋“ค์–ด์ ธ์•ผ ํ•˜๋Š” ๊ตฌํ˜„ ๋ถ€๋ถ„์„ WindowImp๋กœ ์ถ”์ƒํ™”ํ•˜์—ฌ ๋ถ„๋ฆฌํ•จ์œผ๋กœ์„œ ์œ ์—ฐ์„ฑ์„ ํ™•๋ณดํ–ˆ๋‹ค.

ํ™œ์šฉ์„ฑ

  • ์ถ”์ƒ์  ๊ฐœ๋…๊ณผ ๊ตฌํ˜„ ์‚ฌ์ด์˜ ์ง€์†์ ์ธ ์ข…์† ๊ด€๊ณ„๋ฅผ ํ”ผํ•˜๊ณ  ์‹ถ์„ ๋•Œ
    • ๋Ÿฐํƒ€์ž„์— ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์„ ์„ ํƒ (์˜ˆ์‹œ: Display ๋ฐฉ์‹ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ)
  • ์ถ”์ƒ์  ๊ฐœ๋…๊ณผ ๊ตฌํ˜„ ๋ชจ๋‘๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ์„œ๋ธŒ ํด๋ž˜์‹ฑ์„ ํ†ตํ•ด ํ™•์žฅ๋˜์–ด์•ผ ํ•  ๋•Œ
    • Window๋„ ์ƒˆ๋กœ์šด component ์ถ”๊ฐ€๋ฅผ ์œ„ํ•ด ํ™•์žฅ๋˜์–ด์•ผ ํ•จ
    • ์ƒˆ๋กœ์šด ํ”Œ๋žซํผ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ตฌํ˜„์ด ํ•„์š”ํ•˜์—ฌ ํ™•์žฅํ•ด์•ผ ํ•จ
    • ๊ฐ๊ฐ์— ๋Œ€ํ•ด ๋…๋ฆฝ์ ์ธ ํ™•์žฅ์ด ๊ฐ€๋Šฅ
  • ์ถ”์ƒ์  ๊ฐœ๋…์— ๋Œ€ํ•œ ๊ตฌํ˜„ ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ๋‹ค๋ฅธ ๊ด€๋ จ ํ”„๋กœ๊ทธ๋žจ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์•„์•ผ ํ•  ๋•Œ
    • Publication์ด ์ƒ๊ธธ ๋•Œ, ๋‹ค๋ฅธ ๋ถ€๋ถ„์˜ ์ฝ”๋“œ ๋ณ€๊ฒฝ์ด ์—†์—ˆ์Œ

์ฐธ์—ฌ์ž

  • Abstraction(Document): ์ถ”์ƒ์  ๊ฐœ๋…์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์ œ๊ณต
  • RefinedAbstraction(Draft): ์ถ”์ƒ์  ๊ฐœ๋…์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„
  • Implementor(Display): ๊ตฌํ˜„ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์ œ๊ณต
  • Concreteimplementor(SimpleDisplay, CaptureDisplay): Implementor ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„, ์‹ค์งˆ์ ์ธ ๊ตฌํ˜„ ๋‚ด์šฉ

ํ˜‘๋ ฅ ๋ฐฉ๋ฒ•

  • Abstraction ํด๋ž˜์Šค๊ฐ€ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ Implementor๊ฐ์ฒด์— ์ „๋‹ฌํ•œ๋‹ค.
    • ์˜ˆ์‹œ์˜ ๊ฒฝ์šฐ ์ธ์ž๋กœ ๋ฐ›์•„ ์š”์ฒญ์„ ์ „๋‹ฌํ–ˆ์Œ

๊ฒฐ๊ณผ

  1. ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ตฌํ˜„ ๋ถ„๋ฆฌ
    • ์–ด๋–ค ๋ฐฉ์‹์˜ ๊ตฌํ˜„์„ ํƒํ•  ๊ฒƒ์ธ์ง€ ๋Ÿฐํƒ€์ž„์— ๊ฒฐ์ • ๊ฐ€๋Šฅ!
  2. ํ™•์žฅ์„ฑ ์ œ๊ณ 
    • Abstraction๊ณผ Implementor๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์‚ฌ์šฉ์ž์—๊ฒŒ์„œ ์ˆจ๊ธฐ๊ธฐ

๊ด€๋ จ ํŒจํ„ด๊ณผ ์ฐจ์ด์ 

  • 03. Abstract Factory: ํŠน์ • Bridge๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ณตํ•ฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • 09. Adapter: ๊ด€๋ จ ์—†๋Š” ํด๋ž˜์Šค๋“ค์ด ํ•จ๊ป˜ ๋™์ž‘ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ํŠนํ™”๋œ ํŒจํ„ด, ํด๋ž˜์Šค ์„ค๊ณ„๊ฐ€ ๋๋‚˜๊ณ  ์‚ฌ์šฉ๋จ
  • 10. Bridge: ์„ค๊ณ„ ์ดˆ๊ธฐ ๋‹จ๊ณ„์— ์ถ”์ƒํ™” ๋ฐ ๊ตฌํ˜„์ด ๋…๋ฆฝ์ ์œผ๋กœ ๋‹ค์–‘ํ™”๋˜๋„๋ก ๋งŒ๋“ค ๋•Œ ์“ฐ์ธ๋‹ค.

Reference