Builder pattern with TypeScript

๋ณธ ๊ฒŒ์‹œ๋ฌผ์€ Java ์–ธ์–ด๋กœ ๋ฐฐ์šฐ๋Š” ๋””์ž์ธ ํŒจํ„ด ์ž…๋ฌธ - Yuki Hiroshi ์ €๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ณต๋ถ€ํ•œ ๊ฒƒ์„ ์ •๋ฆฌํ•˜๋ฉฐ Typescript๋กœ ์žฌ์ž‘์„ฑํ•ด๋ณธ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

Builder ํŒจํ„ด์ด๋ž€ ?

๋นŒ๋”ฉ์„ ์„ธ์šธ ๋•Œ ์šฐ์„  ์ง€๋ฐ˜์„ ๋‹ค์ง€๊ณ , ๊ณจ๊ฒฉ์„ ์„ธ์šฐ๊ณ , ์•„๋ž˜์—์„œ ์œ„๋กœ ์กฐ๊ธˆ์”ฉ ๋งŒ๋“ค์–ด ๊ฐ„๋‹ค.

์ด๋ ‡๊ฒŒ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ณต์žกํ•œ ๊ฑด๋ฌผ์„ ์„ธ์šธ ๋•Œ ํ•œ ๋ฒˆ์— ์™„์„ฑ์‹œํ‚ค๊ธฐ๋Š” ์–ด๋ ต๋‹ค.

์ด ์ฒ˜๋Ÿผ ์šฐ์„  ์ „์ฒด๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ์žˆ๋Š” ๊ฐ ๋ถ€๋ถ„์„ ๋งŒ๋“ค๊ณ  ๋‹จ๊ณ„๋ฅผ ๋ฐŸ์•„ ๋งŒ๋“ค์–ด ๊ฐ€๋Š”

๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ ์ธ์Šคํ„ด์Šค๋ฅผ ์Œ“์•„ ์˜ฌ๋ฆฌ๋Š” ๊ฒƒ์ด Builder ํŒจํ„ด ์ด๋‹ค.

์˜ˆ์ œ ํ”„๋กœ๊ทธ๋žจ

์ž‘์„ฑํ•  ์˜ˆ์ œ ํ”„๋กœ๊ทธ๋žจ์€ ๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด๋ฉฐ,

๋ฌธ์„œ๋Š” ํƒ€์ดํ‹€์„ ํ•œ ๊ฐœ ํฌํ•จํ•œ๋‹ค, ๋ฌธ์ž์—ด์„ ๋ช‡ ๊ฐœ ํฌํ•จํ•œ๋‹ค, ๊ฐœ๋ณ„ ํ•ญ๋ชฉ์„ ๋ช‡ ๊ฐœ ํฌํ•จํ•œ๋‹ค๋Š” ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

์ด๋ฆ„ ํ•ด์„ค
Builder ๋ฌธ์„œ๋ฅผ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์ถ”์ƒ ํด๋ž˜์Šค
Director ํ•œ ๊ฐœ์˜ ๋ฌธ์„œ๋ฅผ ๋งŒ๋“œ๋Š” ํด๋ž˜์Šค
TextBuilder ์ผ๋ฐ˜ ํ…์ŠคํŠธ๋ฅผ ์ด์šฉํ•ด์„œ ๋ฌธ์„œ๋ฅผ ๋งŒ๋“œ๋Š” ํด๋ž˜์Šค
HTMLBuilder HTML ํŒŒ์ผ์„ ์ด์šฉํ•ด์„œ ๋ฌธ์„œ๋ฅผ ๋งŒ๋“œ๋Š” ํด๋ž˜์Šค
Main ๋™์ž‘ ํ…Œ์ŠคํŠธ์šฉ ํด๋ž˜์Šค

Builder ํด๋ž˜์Šค

// Java
public abstract class Builder {
    public abstract void makeTitle(String title);
    public abstract void makeString(String str);
    public abstract void makeItems(String[] items);
    public abstract void close();
}
// Typescript
abstract class Builder {
  public abstract makeTitle(title: String): void;
  public abstract makeString(str: String): void;
  public abstract makeItems(items: String[]): void;
  public abstract close(): void;
}

Builder ํด๋ž˜์Šค๋Š” ๋ฌธ์„œ๋ฅผ ๋งŒ๋“ค ๋ฉ”์†Œ๋“œ๋“ค์„ ์„ ์–ธํ•˜๊ณ  ์žˆ๋Š” ์ถ”์ƒ ํด๋ž˜์Šค์ด๋‹ค.

Director ํด๋ž˜์Šค

// Java
public class Director {
    private Builder builder;
    public Director(Builder builder) {
        this.builder = builder;
    }
    public void construct() { // ๋ฌธ์„œ ๊ตฌ์ถ•
        builder.makeTitle("์•ˆ๋…•ํ•˜์„ธ์š”"); // ํƒ€์ดํ‹€
        builder.makeString("์•„์นจ๊ณผ ๋‚ฎ์—"); // ๋ฌธ์ž์—ด
        builder.makeItems(new String[]{"์ข‹์€ ์•„์นจ์ž…๋‹ˆ๋‹ค", "์•ˆ๋…•ํ•˜์„ธ์š”"}); // ๊ฐœ๋ณ„ ํ•ญ๋ชฉ
        builder.close(); // ๋ฌธ์„œ ์™„์„ฑ
    }
}
// Typescript
class Director {
  private builder: Builder;

  public constructor(builder: Builder) {
    this.builder = builder;
  }

  // ๋ฌธ์„œ ๊ตฌ์ถ•
  public construct = (): void => {
    this.builder.makeTitle('์•ˆ๋…•ํ•˜์„ธ์š”'); // ํƒ€์ดํ‹€
    this.builder.makeString('์•„์นจ๊ณผ ๋‚ฎ์—'); // ๋ฌธ์ž์—ด
    this.builder.makeItems(['์ข‹์€ ์•„์นจ์ž…๋‹ˆ๋‹ค', '์•ˆ๋…•ํ•˜์„ธ์š”']); // ๊ฐœ๋ณ„ ํ•ญ๋ชฉ
    this.builder.close(); // ๋ฌธ์„œ ์™„์„ฑ
  };
}

Director ํด๋ž˜์Šค๋Š” Builder ํด๋ž˜์Šค๋กœ ์„ ์–ธ๋˜์–ด ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฌธ์„œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

Director ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž์˜ ์ธ์ˆ˜๋Š” Builderํ˜•์ธ๋ฐ,

์‹ค์ œ๋กœ Builder ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ธ์ˆ˜๋กœ ์ฃผ์–ด์ง€๋Š” ๊ฒฝ์šฐ๋Š” ์—†๋‹ค.

Builder ํด๋ž˜์Šค๋Š” ์ถ”์ƒ ํด๋ž˜์Šค์ด๋ฉฐ, ์ด๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ฆ‰, Director ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž์— ์ „๋‹ฌ๋˜๋Š” ๊ฒƒ์€ Builder ํด๋ž˜์Šค์˜ ํ•˜์œ„ ํด๋ž˜์Šค์ธ TextBuilder, HTMLBuilder ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์ด๋‹ค.

construct ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋ฌธ์„œ๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค.

TextBuilder ํด๋ž˜์Šค

// Java
public class TextBuilder extends Builder {
    private StringBuffer buffer = new StringBuffer();
    public void makeTitle(String title) { // ํƒ€์ดํ‹€
        buffer.append("=================\n");
        buffer.append("<" + title + ">\n");
    }
    public void makeString(String str) { // ์ผ๋ฐ˜ ํ…์ŠคํŠธ
        buffer.append(str + "\n");
    }
    public void makeItems(String[] items) { // ๊ฐœ๋ณ„ ํ•ญ๋ชฉ
        for (int i =0; i < items.length; i++) {
            buffer.append("-" + items[i] + "\n");
        }
    }
    public void close() { // ์ข…๋ฃŒ์„ 
        buffer.append("=================\n");
    }
    public String getResult() { // ์™„์„ฑํ•œ ๋ฌธ์„œ
        return buffer.toString();
    }
}
// Typescript
class TextBuilder extends Builder {
  private buffer: string[] = [];
  public makeTitle = (title: String): void => {
    this.buffer.push('=================\n');
    this.buffer.push(title + '\n');
  };

  public makeString = (str: String): void => {
    this.buffer.push(str + '\n');
  };

  public makeItems = (items: String[]): void => {
    for (let i = 0; i < items.length; i++) {
      this.buffer.push(items[i] + '\n');
    }
  };

  public close = (): void => {
    this.buffer.push('=================\n');
  };

  public getResult = (): String => {
    return this.buffer.join('');
  };
}

TextBuilder ํด๋ž˜์Šค๋Š” Builder ํด๋ž˜์Šค์˜ ํ•˜์œ„ ํด๋ž˜์Šค์ด๋‹ค.

์ผ๋ฐ˜ ํ…์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฌธ์„œ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ String์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

HTMLBuilder ํด๋ž˜์Šค

// Java
import java.io.*;

public class HTMLBuilder extends Builder {
    private String filename;
    private PrintWriter writer;
    public void makeTitle(String title) {
        filename = title + ".html";
        // ์ค‘๋žต
    }
    public void makeString(String str) {
        writer.println("<p>" + str + "</p>");
    }
    public void makeItems(String[] items) {
        for (int i = 0; i < items.length; i++) {
            // ์ค‘๋žต
        }
    }
    public void close() {
        writer.close();
    }
    public String getResult() { // ํŒŒ์ผ๋ช…์„ ๋ฐ˜ํ™˜
        return filename;
    }
}

HTML ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ์ž‘์„ฑํ•˜๋Š” ๋‚ด์šฉ์ด๋ผ TS๋Š” ์ƒ๋žตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

HTMLBuilder ํด๋ž˜์Šค๋„ Builder ํด๋ž˜์Šค์˜ ํ•˜์œ„ ํด๋ž˜์Šค์ด๋ฉฐ, HTML ํŒŒ์ผ๋กœ ๋ฌธ์„œ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ  ํŒŒ์ผ๋ช…์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

Main ํด๋ž˜์Šค

public class Main {
    public static void Main(String[] args) {
        if (args.length != 1) {
            usage();
            System.exit(0);
        }
        if (args[0].equals("plain")) {
            TextBuilder textbuilder = new TextBuilder();
            Director director = new Director(textbuilder);
            director.consturct();
            String result = textbuilder.getResult();
            System.out.println(result);
        } else if (args[0].equals("html")) {
            HTMLBuilder htmlbuilder = new HTMLBuilder();
            Director director = new Director(htmlbuilder);
            director.construct();
            String filename = htmlbuilder.getResult();
            System.out.println(filename + "๊ฐ€ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค");
        } else {
            usage();
            System.exit(0);
        }
    }

    public static void usage() {
        System.out.println("Usage: java Main plane ์ผ๋ฐ˜ ํ…์ŠคํŠธ๋กœ ๋ฌธ์„œ์ž‘์„ฑ");
        System.out.println("Usage: java Main html  HTML ํŒŒ์ผ๋กœ ๋ฌธ์„œ์ž‘์„ฑ");
    }
}

TextBuilder ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ํ˜น์€ HTMLBuilder ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ Director ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค.

TexBuilder, HTMLBuilder๋Š” Builder ํด๋ž˜์Šค์˜ ํ•˜์œ„ ํด๋ž˜์Šค์ด๊ณ 

Director๋Š” Builder์˜ ๋ฉ”์†Œ๋“œ๋งŒ์„ ์‚ฌ์šฉํ•ด์„œ ๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

Builder์˜ ๋ฉ”์†Œ๋“œ๋งŒ์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์€ Director๋Š” ์‹ค์ œ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์ด TextBuilder์ธ์ง€, HTMLBuilder์ธ์ง€ ๋ชจ๋ฅธ๋‹ค๋Š” ๋œป์ด๋‹ค.

๋”ฐ๋ผ์„œ Builder๋Š” ๋ฌธ์„œ๋ฅผ ๊ตฌ์ถ•ํ•˜๋ ค๋Š” ๋ชฉ์ ์„ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ•„์š” ์ถฉ๋ถ„ํ•œ ๋ฉ”์†Œ๋“œ๊ตฐ์„ ์„ ์–ธํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

๋‹จ, ์ผ๋ฐ˜ ํ…์ŠคํŠธ๋‚˜ HTML ํŒŒ์ผ์— ๊ณ ์œ ์˜ ๋ฉ”์†Œ๋“œ๊นŒ์ง€ Builder๊ฐ€ ์ œ๊ณตํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค.

Builder ํŒจํ„ด์˜ ๊ตฌ์„ฑ์š”์†Œ

  • Builder

    Builder ์—ญํ• ์€ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.

    ์ธ์Šคํ„ด์Šค์˜ ๊ฐ ๋ถ€๋ถ„์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ๊ฐ€ ์ค€๋น„๋˜์–ด ์žˆ์œผ๋ฉฐ, ์˜ˆ์ œ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” Builder ํด๋ž˜์Šค๊ฐ€ ์ด ์—ญํ• ์„ ๋‹ด๋‹นํ•œ๋‹ค.

  • ConcreteBuilder

    ConcreteBuilder ์—ญํ• ์€ Builder ์—ญํ• ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋Š” ํด๋ž˜์Šค์ด๋‹ค.

    ์‹ค์ œ ์ธ์Šคํ„ด์Šค ์ž‘์„ฑ์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์†Œ๋“œ, ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ธฐ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ๊ฐ€ ์ค€๋น„๋˜์–ด ์žˆ๋‹ค.

    ์˜ˆ์ œ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” TextBuilder, HTMLBuilder ํฌ๋ž˜์Šค๊ฐ€ ์ด ์—ญํ• ์„ ๋‹ด๋‹นํ•œ๋‹ค.

  • Director

    Director ์—ญํ• ์€ Builder ์—ญํ• ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

    ConcreteBuilder ์—ญํ• ๊ณผ ๊ด€๊ณ„์—†์ด ์ œ๋Œ€๋กœ ๊ธฐ๋Šฅํ•˜๋„๋ก Builder ์—ญํ• ์˜ ๋ฉ”์†Œ๋“œ๋งŒ์„ ์‚ฌ์šฉํ•œ๋‹ค.

    ์˜ˆ์ œ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” Director ํด๋ž˜์Šค๊ฐ€ ์ด ์—ญํ• ์„ ๋‹ด๋‹นํ•œ๋‹ค.

  • Client

    Builder ํŒจํ„ด์„ ์ด์šฉํ•˜๋Š” ์—ญํ• ์ด๋ฉฐ, ์˜ˆ์ œ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” Main ํด๋ž˜์Šค๊ฐ€ ์—ญํ• ์„ ๋‹ด๋‹นํ•˜์˜€๋‹ค.

    GoF ์ฑ…์—์„œ๋Š” Client ์—ญํ• ์€ Builder ํŒจํ„ด ์•ˆ์— ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค.

diagram

๋ˆ„๊ฐ€ ๋ฌด์—‡์„ ์•Œ๊ณ  ์žˆ์„๊นŒ ?

OOP์—์„œ โ€œ๋ˆ„๊ฐ€ ๋ฌด์—‡์„ ์•Œ๊ณ  ์žˆ์„๊นŒ?โ€, โ€œ์–ด๋–ค ํด๋ž˜์Šค๊ฐ€ ์–ด๋–ค ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ?โ€ ๋Š” ์ƒ๋‹นํžˆ ์ค‘์š”ํ•˜์—ฌ ์ฃผ์˜ํ•˜๋ฉฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

  • Main ํด๋ž˜์Šค๋Š” Builder ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ๋ชจ๋ฅด๋ฉฐ, Director ํด๋ž˜์Šค์˜ construct ๋ฉ”์†Œ๋“œ๋งŒ์„ ํ˜ธ์ถœํ•œ๋‹ค.
  • Director ํด๋ž˜์Šค๋Š” Builder ํด๋ž˜์Šค๋ฅผ ์•Œ๊ณ  ์žˆ์–ด, ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์„œ๋ฅผ ๊ตฌ์ฐฉํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ์ด์šฉํ•˜๊ณ  ์žˆ๋Š” ํด๋ž˜์Šค๊ฐ€ TextBuilder, HTMLBuilder ๋˜๋Š” Builder์˜ ๋‹ค๋ฅธ ํ•˜์œ„ ํด๋ž˜์Šค์ธ์ง€ ๋ชจ๋ฅธ๋‹ค.
  • Director ํด๋ž˜์Šค๊ฐ€ ์ž์‹ ์ด ์ด์šฉํ•˜๊ณ  ์žˆ๋Š” Builder ํด๋ž˜์Šค์˜ ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๊ต์ฒดํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๊ตํ™˜์ด ๊ฐ€๋Šฅํ•˜๊ณ , ๊ต์ฒด๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€ํ’ˆ์œผ๋กœ์„œ ๊ฐ€์น˜๊ฐ€ ๋†’๋‹ค.

๊ตํ™˜๊ฐ€๋Šฅ์„ฑ์€ ํด๋ž˜์Šค์˜ ์„ค๊ณ„์ž๋กœ์จ ํ•ญ์ƒ ๊ธฐ์–ตํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

์„ค๊ณ„ ์‹œ์— ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ, ๊ฒฐ์ •ํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ

Builder ํด๋ž˜์Šค๋Š” ๋ฌธ์„œ๋ฅผ ๊ตฌ์ถ•ํ•  ๋•Œ ํ•„์š” ์ถฉ๋ถ„ํ•œ ๋ฉ”์†Œ๋“œ๊ตฐ์„ ์„ ์–ธํ•ด์•ผ ํ•œ๋‹ค.

์™œ๋ƒํ•˜๋ฉด Director ํด๋ž˜์Šค์— ์ฃผ์–ด์ง„ ๋„๊ตฌ๋Š” Builder ํด๋ž˜์Šค๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋„๊ตฌ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์˜ˆ์ œ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” Text์™€ HTML ํ˜•์‹์˜ ํŒŒ์ผ๋งŒ์„ Build ํ–ˆ์ง€๋งŒ, ๋ฏธ๋ž˜์— ASDF๋ผ๋Š” ํ˜•์‹์ด ๋‚˜์™”์„ ๋•Œ ASDFBuilder ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ์ง€, ์ƒˆ๋กœ์šด ๋ฉ”์†Œ๋“œ๊ฐ€ ํ•„์š”ํ• ์ง€๋Š” ๋ชจ๋ฅธ๋‹ค.

์ด์ฒ˜๋Ÿผ ๋ชจ๋“  ๊ฒƒ์„ ์˜ˆ์ƒํ•  ์ˆ˜๋Š” ์—†๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ€๊นŒ์šด ๋ฏธ๋ž˜์— ๋ฐœ์ƒํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” ๋ณ€ํ™”์— ์ ์‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ•ด์•ผ ํ•œ๋‹ค.

๊ด€๋ จ ํŒจํ„ด

  • Template Method

    Director ์—ญํ• ์ด Builder ์—ญํ• ์„ ์ œ์–ด, Template Method ํŒจํ„ด์—์„œ๋Š” ์ƒ์œ„ ํด๋ž˜์Šค๊ฐ€ ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ์ œ์–ดํ•œ๋‹ค.

  • Composite

    Builder ํŒจํ„ด์— ์˜ํ•ด ๋งŒ๋“ค์–ด์ง„ ์ƒ์„ฑ๋ฌผ์€ Composite ํŒจํ„ด์ด ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

  • Abstract Factory

    Builder ํŒจํ„ด๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ณต์žกํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ ํ•œ๋‹ค.

  • Facade

    Director ์—ญํ• ์€ Builder ์—ญํ• ์˜ ๋ณต์žกํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์กฐํ•ฉํ•ด์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์™ธ๋ถ€์— ์ œ๊ณตํ•˜๋Š” ๊ฒƒ (construct)์ด๋‹ค. Facade ํŒจํ„ด์˜ Facade ์—ญํ• ์€ ๋‚ด๋ถ€ ๋ชจ๋“ˆ์„ ์กฐํ•ฉํ•ด ๋‹จ์ˆœํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์™ธ๋ถ€์— ์ œ๊ณตํ•œ๋‹ค.


Written by@hyesungoh
Learning every moment

InstagramGitHubLinkedIn