[GoF] Builder 패턴 : 복잡한 인스턴스를 조립한다 [구조를 가진 인스턴스를 만들어 가는 패턴]

2023. 8. 29. 11:38·◈ Study/디자인패턴(GoF)🥞
728x90
반응형

- Builder 패턴 : 복잡한 인스턴스를 조립한다

Builder 패턴은 구조를 가진 인스턴스를 만들어 가는 패턴으로, 뼈대를 만들고 아래에서 위로 만들어 간다.

Builder 패턴 / 참고자료 : https://refactoring.guru/ko/design-patterns/builder

- 어떤 경우에 사용할까?

Builder 패턴은 구체적인 하위 클래스를 모른다는 게 큰 장점이다. 모르기 때문에 교체가 가능하고, 교체되기 때문에 부품으로서의 가치가 높다. 클래스 설계자는 '교체 가능성'을 항상 염두에 둘 필요가 있다.

- 예제 코드

Builder 패턴 클래스 다이어그램 / 참고자료 : JAVA 언어로 배우는 디자인 패턴 입문


이름 설명
Builder 문서를 구성하기 위한 메서드를 규정한 추상 클래스
Director 하나의 문서를 만드는 클래스
TextBuilder 텍스트(일반 문자열)를 이용하여 문서를 만드는 클래스
HTMLBuilder HTML 파일을 이용하여 문서를 만드는 클래스
Main 동작 테스트용 클래스

- Builder 클래스

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();
}

- Director 클래스

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();
	}
}

- TextBuilder 클래스

public class TextBuilder extends Builder {
	private StringBuilder sb = new StringBuilder();
	
	@Override
	public void makeTitle(String title) {
		sb.append("==============================\n");
		sb.append("[");
		sb.append(title);
		sb.append("]\n\n");
	}

	@Override
	public void makeString(String str) {
		sb.append("■");
		sb.append(str);
		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 getTextResult() {
		return sb.toString();
	}
}

- HTMLBuilder 클래스

import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class HTMLBuilder extends Builder {
	private String filename = "untitled.html";
	private StringBuilder sb = new StringBuilder();
	
	@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("</head></title>\n");
		sb.append("<body>\n");
		sb.append("<h1>");
		sb.append(title);
		sb.append("</h1>\n\n");
	}

	@Override
	public void makeString(String str) {
		sb.append("<p>");
		sb.append(str);
		sb.append("</p>\n\n");
	}

	@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;
	}
}

- Main 클래스

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].equals("html")) {
			HTMLBuilder 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  \t  텍스트로 문서 작성");
		System.out.println("Usage: java Main html  \t  HTML 파일로 문서 작성");
	}
}

 

참고문헌 : 유키 히로시 저/김성훈 역(2022), JAVA 언어로 배우는 디자인 패턴 입문, 영진닷컴

참고자료 : https://refactoring.guru/ko/design-patterns/builder


728x90
반응형
'◈ Study/디자인패턴(GoF)🥞' 카테고리의 다른 글
  • [GoF] Strategy 패턴 : 알고리즘을 모두 바꾼다 [같은 문제를 다른 방법으로 해결하기 쉽게 만들어주는 패턴]
  • [GoF] Bridge 패턴 : 기능 계층과 구현 계층을 나눈다 [기능의 클래스 계층과 구현의 클래스 계층을 연결하는 패턴]
  • [GoF] Prototype 패턴 : 복사해서 인스턴스를 만든다 [인스턴스로부터 다른 인스턴스를 생성하는 패턴]
  • [GoF] Singleton 패턴 : 인스턴스를 단 하나만 만든다 [인스턴스가 하나만 존재하는 것을 보증하는 패턴]
예르미(yermi)
예르미(yermi)
끊임없이 제 자신을 계발하는 개발자입니다👨🏻‍💻
  • 예르미(yermi)
    예르미의 코딩노트
    예르미(yermi)
  • 전체
    오늘
    어제
    • 분류 전체보기 (1025) N
      • ◎ Java (133)
        • Java☕ (93)
        • JSP📋 (26)
        • Applet🧳 (6)
        • Interview👨🏻‍🏫 (8)
      • ◎ JavaScript (48)
        • JavaScript🦎 (25)
        • jQuery🌊 (8)
        • React🌐 (2)
        • Vue.js🔰 (6)
        • Node.js🫒 (3)
        • Google App Script🐑 (4)
      • ◎ HTML5+CSS3 (17)
        • HTML5📝 (8)
        • CSS3🎨 (9)
      • ──────────── (0)
      • ▣ Framework (67)
        • Spring🍃 (36)
        • Spring Boot🍀 (12)
        • Bootstrap💜 (3)
        • Selenium🌕 (6)
        • MyBatis🐣 (10)
      • ▣ Tools (47)
        • API🎯 (18)
        • Library🎲 (15)
        • JitPack🚀 (3)
        • Jenkins👨🏻 (7)
        • Thymeleaf🌿 (4)
      • ▣ Server (30)
        • Apache Tomcat🐱 (14)
        • Apache HTTP Server🛡️ (1)
        • Nginx🧶 (7)
        • OracleXE💿 (4)
        • VisualSVN📡 (4)
      • ▣ Infra & DevOps (20) N
        • LGTM Stack🔭 (5)
        • Kafka🐦‍🔥 (0)
        • Kubernetes🚢 (9) N
        • KubeCon Japan 2026⚓ (6)
      • ▣ OS : 운영체제 (18)
        • cmd : 명령프롬프트💻 (10)
        • Linux🐧 (8)
      • ▣ SQL : Database (56)
        • Oracle SQL🏮 (26)
        • PL SQL💾 (9)
        • MySQL🐬 (6)
        • MariaDB🦦 (6)
        • H2 Database🔠 (3)
        • SQL 실전문제🐌 (6)
      • ────────── (0)
      • ◈ Human Project (86)
        • Mini : Library Service📚 (15)
        • 화면 설계 [HTML]🐯 (10)
        • 서버 프로그램 구현🦁 (15)
        • Team : 여수어때🛫 (19)
        • Custom : Student🏫 (9)
        • Custom : Board📖 (18)
      • ◈ Yermi Project (49)
        • 조사모아(Josa-moa)📬 (5)
        • Riddle-Game🧩 (6)
        • 맛있을 지도🍚 (2)
        • 어디 가! 박대리!🙋🏻‍♂️ (5)
        • 조크베어🐻‍❄️ (4)
        • Looks Like Thirty🦉 (2)
        • Toy Project💎 (12)
        • 오픈소스 파헤치기🪐 (5)
        • 오늘가챠🃏 (8)
      • ◈ Refactoring (15)
        • Mini : Library Service📚 (8)
        • 서버 프로그램 구현🦁 (1)
        • Team : 여수어때🛫 (0)
        • 쿼리 튜닝일지🔧 (6)
      • ◈ Coding Test (80)
        • 백준(BOJ)👨🏻‍💻 (71)
        • 프로그래머스😎 (2)
        • 코드트리🌳 (7)
      • ◈ Study (129)
        • 기초튼튼 개발지식🥔 (25)
        • HTTP 웹 지식💡 (4)
        • 클린코드(Clean Code)🩺 (1)
        • 디자인패턴(GoF)🥞 (12)
        • 알고리즘(Algorithm)🎡 (14)
        • 다이어그램(Diagram)📈 (4)
        • 파이썬(Python)🐍 (16)
        • 에러노트(Error Note)🧱 (34)
        • 웹 보안(Web Security)🔐 (11)
        • 인공지능 AI🛸 (8)
      • ◈ 공부모임 (57)
        • 혼공학습단⏰ (18)
        • 코드트리 챌린지👊🏻 (2)
        • 개발도서 100독👟 (8)
        • 나는 리뷰어다🌾 (17)
        • 국가기술자격 서포터즈🌻 (12)
      • ◈ 자격증 공부 (48)
        • 정보처리기사🔱 (16)
        • 정보처리산업기사🔅 (9)
        • 정보보안기사⚜️ (11)
        • 컴퓨터활용능력 1급📼 (12)
      • ─────────── (0)
      • ◐ 기타 (124)
        • 알아두면 좋은 팁(tip)✨ (46)
        • 개발자의 일상🎈 (55)
        • 개발도서 서평🔍 (10)
        • 개발관련 세미나🎤 (2)
        • 블로그 꾸미기🎀 (9)
        • 사도신경 프로젝트🎚️ (2)
  • 인기 글

  • 최근 댓글

  • 반응형
    250x250
  • 태그

    코딩 테스트
    spring boot
    Database
    백준
    프로그래밍
    CSS
    꿀팁
    spring
    Java
    백준 티어
    Project
    javascript
    코딩
    SQL
    jsp
    Error Note
    Oracle
    자바스크립트
    일상
    BOJ
  • hELLO· Designed By정상우.v4.10.3
예르미(yermi)
[GoF] Builder 패턴 : 복잡한 인스턴스를 조립한다 [구조를 가진 인스턴스를 만들어 가는 패턴]
상단으로

티스토리툴바