Post

โ›“๏ธ Java Design-Pattern โ…ง - Builder

โ›“๏ธ Java Design-Pattern โ…ง - Builder

๐Ÿ“— ใ€ŽJAVA ์–ธ์–ด๋กœ ๋ฐฐ์šฐ๋Š” ๋””์ž์ธ ํŒจํ„ด : ์‰ฝ๊ฒŒ ๋ฐฐ์šฐ๋Š” GoF์˜ 23๊ฐ€์ง€ ๋””์ž์ธ ํŒจํ„ดใ€๋ฅผ ์ฝ๊ณ  ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

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

  • ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด ๊ฐ€๋Š” ํŒจํ„ด์„ย Builderย ํŒจํ„ด์ด๋ผ๊ณ  ํ•œ๋‹ค.

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

  • ๋‹ค์Œ์€ย Builderย ํŒจํ„ด์„ ์ด์šฉํ•ด ๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด๋‹ค. ํ”„๋กœ๊ทธ๋žจ์˜ ์š”๊ตฌ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

โ€œํƒ€์ดํ‹€์„ ํ•œ ๊ฐœ ํฌํ•จํ•œ๋‹ค.โ€
โ€œ๋ฌธ์ž์—ด์„ ๋ช‡ ๊ฐœ ํฌํ•จํ•œ๋‹ค.โ€
โ€œํ•ญ๋ชฉ์„ ๋ช‡ ๊ฐœ ํฌํ•จํ•œ๋‹ค.โ€

  • Builderย ์ถ”์ƒ ํด๋ž˜์Šค์—์„œ๋Š” ๋ฌธ์„œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ์„ ์–ธํ•œ๋‹ค.
  • Directorย ํด๋ž˜์Šค๋Š” ๊ทธ ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ๊ตฌ์ฒด์ ์ธ ํ•˜๋‚˜์˜ ๋ฌธ์„œ๋ฅผ ๋งŒ๋“ ๋‹ค.
  • TextBuilder,ย HTMLBuilderย ํด๋ž˜์Šค๋Š”ย Builderย ํด๋ž˜์Šค๋ฅผ ๊ตฌ์ฒด์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.

Builderย ํด๋ž˜์Šค

1
2
3
4
5
6
public abstract class Builder {
	public abstract void makeTitle(String title);
    public abstract void makeString(String string);
    public abstract void makeItems(String[] items);
    public abstract void close();
}
  • ๋ฌธ์„œ๋ฅผ ๋งŒ๋“œ๋Š” ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋“ค์„ ์„ ์–ธํ•œ ์ถ”์ƒ ํด๋ž˜์Šค์ด๋‹ค.

Directorย ํด๋ž˜์Šค

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
public class Director {
	private Builder builder;
    
    public Director(Builder builder) {
    	this.builder = builder;
    }
    
    public void construct() {
    	builder.makeTitle("Greeting");
        builder.makeString("์ผ๋ฐ˜์ ์ธ ์ธ์‚ฌ");
        builder.makeItems(
        	new String[]{
        		"How are you?",
                "Hello",
                "Hi"
        	}
        );
        builder.makeString("์‹œ๊ฐ„๋Œ€๋ณ„ ์ธ์‚ฌ");
        builder.makeItems(
        	new String[]{
        		"Good morning",
                "Good afternoon",
                "Good evening"
        	}
        );
        builder.close();
    }
}
  • Directorย ํด๋ž˜์Šค ์ƒ์„ฑ์ž์˜ ์ธ์ž๋กœย Builderํ˜• ํ•„๋“œ๋ฅผ ๊ฐ–๋Š”๋‹ค.
  • ๊ทธ๋Ÿฐ๋ฐ ํ•ด๋‹น ํด๋ž˜์Šค๋Š” ์ถ”์ƒ ํด๋ž˜์Šค์ด๋ฏ€๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์„ฑ์ž์— ์‹ค์ œ๋กœ ์ „๋‹ฌ๋˜๋Š” ๊ฒƒ์€ย Builderย ํด๋ž˜์Šค์˜ ํ•˜์œ„ ํด๋ž˜์Šค์ธย TextBuilderย ๋˜๋Š”ย HTMLBuilderย ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋œ๋‹ค.
  • constructย ๋ฉ”์†Œ๋“œ๋Š” ๋ฌธ์„œ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฉ”์†Œ๋“œ์ด๋‹ค.

TextBuilderย ํด๋ž˜์Šค

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
32
33
34
35
36
37
public class TextBuilder extends Builder {
	private StringBuffer sb = new StringBuffer();
    
    @Override
	public void makeTitle(String title) {
		sb.append("==================================\n");
		sb.append("[");
        sb.append(title);
        sb.append("]\n\n");
	}
    
    @Override
	public void makeString(String string) {
    	sb.append("โ– ");
		sb.append(string);
		sb.append("\n\n");
	}
    
    @Override
	public void makeItems(String[] items) {
		for (String s : items) {
        	sb.append(" .");
            sb.append("s");
            sb.append("\n");
        }
        sb.append("\n");
	}
    
    @Override
	public void close() {
		sb.append("==================================\n");
	}
    
	public String getResult() {
		return sb.toString();
	}
}
  • ๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌย Stringย ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

HTMLBuilderย ํด๋ž˜์Šค

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import java.io.*;

public class HTMLBuilder extends Builder {
	private String filename = "untitled.html";
	private StringBuffer sb = new StringBuffer();
    
    @Override
	public void makeTitle(String title) {
		filename = title + ".html";
		sb.append("<!DOCTYPE html>\n");
        sb.append("<html>\n");
        sb.append("<head><title>");
        sb.append(title);
        sb.append("</title></head>\n");
        sb.append("<body>\n");
        sb.append("<h1>");
        sb.append(title);
        sb.append("</h1>\n\n");
	}
    
    @Override
	public void makeString(String string) {
        sb.append("<p>");
        sb.append(string);
        sb.append("</p>");
	}
    
    @Override
	public void makeItems(String[] items) {
		sb.append("<ul>\n");
        
        for (String s : items) {
        	sb.append("<li>");
            sb.append(s);
            sb.append("</li>\n");
        }
        
        sb.append("</ul>\n\n");
	}
    
    @Override
	public void close() {
		sb.append("</body>");
        sb.append("</html>\n");
        
        try {
        	Writer writer = new FileWriter(filename);
            writer.write(sb.toString());
            writer.close();
        } catch (IOException e) {
        	e.printStackTrace();
        }
	}
    
	public String getHtmlResult() {
		return filename;
	}
}
  • HTMLย ํŒŒ์ผ ํ˜•ํƒœ๋กœ ๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌย HTMLย ํŒŒ์ผ์˜ ํŒŒ์ผ๋ช…์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

Mainย ํด๋ž˜์Šค

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
32
33
34
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;

public class Main {
	public static void main(String[] args) {
    	if (args.length != 1) {
        	usage();
            System.exit(0);
        }
        
        if (args[0].equals("text")) {
        	TextBuilder textBuilder = new TextBuilder();
            Director director = new Director(textBuilder);
            director.construct();
            String result = textBuilder.getTextResult();
            System.out.println(result);
        } else if (args[0].eqauls("html")) {
        	HTMLBuiler htmlBuilder = new HTMLBuilder();
            Director director = new Director(htmlBuilder);
            director.construct();
            String filename = htmlBuilder.getHtmlResult();
            System.out.println("HTML ํŒŒ์ผ" + filename + "์ด ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
        } else {
        	usage();
            System.exit(0);
        }
    }
    
    public static void usage() {
    	System.out.println("Usage: java Main text	 ํ…์ŠคํŠธ๋กœ ๋ฌธ์„œ ์ž‘์„ฑ");
        System.out.println("Usage: java Main html	 HTML ํŒŒ์ผ๋กœ ๋ฌธ์„œ ์ž‘์„ฑ");
    }
}
  • ์ปค๋งจ๋“œ ๋ผ์ธ์—์„œย java Main text์™€ ๊ฐ™์ดย text๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ง€์ •ํ•œ ๊ฒฝ์šฐย TextBuilderย ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผย Directorย ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž์— ์ „๋‹ฌํ•œ๋‹ค.
  • ๋ฐ˜๋ฉดย html์„ ์ง€์ •ํ•œ ๊ฒฝ์šฐ์—๋Š”ย HTMLBuilderย ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
  • Builder์˜ ๋ฉ”์†Œ๋“œ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์€ย Director๋Š” ์‹ค์ œ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์ดย TextBuilder์ธ์ง€ย HTMLBuilder์ธ์ง€ ์˜์‹ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • Builder๋Š” ๋ฌธ์„œ ๊ตฌ์ถ•์— ํ•„์š”ํ•œ ์ถฉ๋ถ„ํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋˜, ํ…์ŠคํŠธ๋‚˜ย HTMLย ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ๊ณ ์œ ํ•œ ๋ฉ”์†Œ๋“œ๊นŒ์ง€ ์ œ๊ณตํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค.
  • ์˜์กด์„ฑ์ด ์ƒ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Builderย ํŒจํ„ด์˜ ๋“ฑ์žฅ์ธ๋ฌผ

Builderย ํด๋ž˜์Šค

  • ์ธ์Šคํ„ด์Šค ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฑด์ถ•๊ฐ€ย Builderย ์—ญํ• ์„ ํ•œ๋‹ค.
  • ๊ฑด์ถ•๊ฐ€ ์—ญํ• ์—๋Š” ์ธ์Šคํ„ด์Šค์˜ ๊ฐ ๋ถ€๋ถ„์„ ๋งŒ๋“œ๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ์ค€๋น„๋œ๋‹ค.

TextBuilder,ย HTMLBuilderย ํด๋ž˜์Šค

  • ๊ฑด์ถ•๊ฐ€์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ๊ฑด์ถ•๊ฐ€ย ConcreteBuilderย ์—ญํ• ์ด๋‹ค.
  • ์‹ค์ œ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ์—ฌ๊ธฐ์— ๊ตฌํ˜„๋˜๋ฉฐ, ์ตœ์ข…์ ์œผ๋กœ ์™„์„ฑ๋œ ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ์ค€๋น„๋œ๋‹ค.

Directorย ํด๋ž˜์Šค

  • ๊ฑด์ถ•๊ฐ€์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฐ๋…๊ด€ย Directorย ์—ญํ• ์„ ํ•œ๋‹ค.ย 
  • ๊ตฌ์ฒด์ ์ธ ๊ฑด์ถ•๊ฐ€ ์—ญํ• ์ด ๋ฌด์—‡์ด๋“  ์ž˜ ์ž‘๋™ํ•˜๋„๋ก ๊ฑด์ถ•๊ฐ€์˜ ๋ฉ”์†Œ๋“œ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.

Mainย ํด๋ž˜์Šค

  • Builderย ํŒจํ„ด์„ ์ด์šฉํ•˜๋Š” ์˜๋ขฐ์ธย Client์ด๋‹ค.

์ฑ…์—์„œ ์ œ์‹œํ•˜๋Š” ํžŒํŠธ

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

  • ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ์–ด๋А ํด๋ž˜์Šค๊ฐ€ ์–ด๋А ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€๊ฐ€ ๋งค์šฐ ์ค‘์š”ํ•˜๋ฏ€๋กœ ์ฃผ์˜ํ•ด์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•ด์•ผ ํ•œ๋‹ค.
  • Mainย ํด๋ž˜์Šค๋Š”ย Directorย ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๋งŒ ํ˜ธ์ถœํ•˜๋ฏ€๋กœย Builderย ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ๋ชจ๋ฅธ๋‹ค.
  • Directorย ํด๋ž˜์Šค๋Š”ย Builderย ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์•Œ์ง€๋งŒ ์‹ค์ œ๋กœ ์–ด๋–ค ๊ตฌํ˜„์ฒด์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ด์šฉํ•˜๋Š”์ง€ ๋ชจ๋ฅธ๋‹ค.ย 
  • ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌํ˜„์ฒด๋ฅผ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.ย 
  • ํ•ญ์ƒ ๊ต์ฒด ๊ฐ€๋Šฅ์„ฑ์„ ์—ผ๋‘์— ๋‘๊ณ  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•ด์•ผ ํ•œ๋‹ค.

์˜์กด์„ฑ ์ฃผ์ž…

  • ์•ž์„œย Directorย ํด๋ž˜์Šค๋Š”ย Builder์˜ ์–ด๋–ค ๊ตฌํ˜„์ฒด๋ฅผ ์ด์šฉํ•˜๋Š”์ง€ ๋ชจ๋ฅธ๋‹ค๊ณ  ํ–ˆ๋‹ค.
  • ๊ทธ๋Ÿฐ๋ฐ ์‹ค์ œ๋กœ ๋™์ž‘ํ•˜๋ ค๋ฉดย Builder์˜ ๊ตฌ์ฒด์ ์ธ ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•„์ˆ˜๋กœ ํ•„์š”ํ•˜๋ฏ€๋กœย Director๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ธ์ž๋กœย TextBuilderย ๋˜๋Š”ย HTMLBuilder๋ฅผ ๋„ฃ์–ดย builderย ํ•„๋“œ์— ์ฃผ์ž…ํ•œ๋‹ค.
  • ์ด๋ฅผ ์˜์กด์„ฑ ์ฃผ์ž…ย Dependency Injection๋ผ๊ณ  ํ•œ๋‹ค.
  • ์˜์กด์„ฑ ์ฃผ์ž…์ด๋ž€ โ€œ์ด ์ธ์Šคํ„ด์Šค์— ์˜์กดํ•˜์—ฌ ๋™์ž‘ํ•ด์ฃผ์„ธ์š”.โ€๋ผ๋Š” ์˜๋ฏธ๋ฅผ ๋‹ด์•„ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฑด๋„ค๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.

์„ค๊ณ„ ์‹œ ๊ฒฐ์ • ์‚ฌํ•ญ

  • Builderย ํด๋ž˜์Šค๋Š” ๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ถฉ๋ถ„ํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์„ ์–ธํ•ด์•ผ ํ•œ๋‹ค.ย 
  • Directorย ํด๋ž˜์Šค์—๊ฒŒ ์ฃผ์–ด์ง€๋Š” ๋„๊ตฌ๋Š”ย Builderย ํด๋ž˜์Šค๊ฐ€ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ๋˜ํ•œ ๋ฏธ๋ž˜๋ฅผ ์™„์ „ํžˆ ์˜ˆ์ธกํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ ์•ž์œผ๋กœ ๋Š˜์–ด๋‚  ํ•˜์œ„ ํด๋ž˜์Šค์—๋„ ์–ด๋А์ •๋„ ๊ฒฌ๋”œ ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค.

์†Œ์Šค๋ฅผ ์ฝ๊ณ  ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•

  • ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•  ๋•Œ, ๊ธฐ์กด ์†Œ์Šค๋ฅผ ์ฝ์–ด์•ผ ํ•œ๋‹ค.
  • ๊ทธ๋Ÿฐ๋ฐ ์ถ”์ƒ ํด๋ž˜์Šค๋งŒ ์‚ดํŽด๋ณธ๋‹ค๊ณ  ์ •๋ณด๊ฐ€ ๊ทธ๋‹ค์ง€ ๋งŽ์ด ๋Š˜์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค.
  • ์˜ˆ์ œ ํ”„๋กœ๊ทธ๋žจ์„ ์˜ˆ๋กœ ๋“ค๋ฉด ์ ์–ด๋„ย Director์˜ ์†Œ์Šค๋ฅผ ์ฝ๊ณ ย Builderย ํด๋ž˜์Šค์˜ ์‚ฌ์šฉ๋ฒ•์„ ์ดํ•ดํ•ด์•ผ ํ•œ๋‹ค.
  • ์ดํ›„์—๋Š”ย TextBuilder,ย HTMLBuilderย ํด๋ž˜์Šค๋ฅผ ์ฝ๊ณ ย Builder์˜ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ์— ์–ด๋–ค ๋™์ž‘์ด ๊ธฐ๋Œ€๋˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
  • ์†Œ์Šค๋ฅผ ์ฝ๋Š” ๋‹จ์„œ๋กœย @Override๋„ ๋„์›€์ด ๋œ๋‹ค.
  • ํด๋ž˜์Šค์˜ ์—ญํ• ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋ฉด ์‹ค์ˆ˜๋กœย Directorย ํด๋ž˜์Šค๊ฐ€ย Builderย ํด๋ž˜์Šค์˜ ํŠน์ • ๊ตฌํ˜„์ฒด๋งŒ์„ ๋ฐ”๋ผ๋ณด๋„๋ก ํ•˜๋ฉด ๋…๋ฆฝ์„ฑ์ด ์†์ƒ๋˜์–ด ์ธ์Šคํ„ด์Šค์˜ ๊ต์ฒด ๊ฐ€๋Šฅ์„ฑ์ด ๋ฌด๋„ˆ์งˆ ์ˆ˜ ์žˆ๋‹ค.
This post is licensed under CC BY 4.0 by the author.