This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| design_pattern:builder_pattern [2017/10/28 08:21] – ledyx | design_pattern:builder_pattern [2021/02/07 03:25] (current) – [Builder Pattern] ledyx | ||
|---|---|---|---|
| Line 3: | Line 3: | ||
| * 복잡한 구조를 한 번에 완성시키기 어려움. 그렇기 때문에 각 부분을 만들고 단계적으로 조립. | * 복잡한 구조를 한 번에 완성시키기 어려움. 그렇기 때문에 각 부분을 만들고 단계적으로 조립. | ||
| - | {{tag> | + | {{tag> |
| + | = Director = | ||
| + | <sxh java ; highlight : [9, | ||
| + | /* Builder 역할의 인터페이스(API)를 사용해서 인스턴스 조립/ | ||
| + | public class Director { | ||
| + | private Builder builder; | ||
| + | |||
| + | public Director(Builder builder) { | ||
| + | this.builder = builder; | ||
| + | } | ||
| + | |||
| + | public void construct() { | ||
| + | builder.setHeader(); | ||
| + | builder.setMessage(" | ||
| + | builder.setFooter(); | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||
| + | = Builder, ConcreteBuilder = | ||
| + | |||
| + | <sxh java ; title: Builder> | ||
| + | /* 인스턴스의 각 부분을 만들기 위한 메소드 준비 */ | ||
| + | public abstract class Builder { | ||
| + | protected StringBuffer buffer = new StringBuffer(); | ||
| + | |||
| + | public abstract void setHeader(); | ||
| + | public abstract void setMessage(String... items); | ||
| + | public abstract void setFooter(); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | <sxh java ; title: ConcreteBuilder> | ||
| + | public class PlainTextBuilder extends Builder { | ||
| + | |||
| + | @Override | ||
| + | public void setHeader() { | ||
| + | buffer.append(" | ||
| + | } | ||
| + | |||
| + | @Override | ||
| + | public void setMessage(String... items) { | ||
| + | |||
| + | Stream.of(items).forEach(str -> { | ||
| + | buffer.append(str); | ||
| + | buffer.append(" | ||
| + | }); | ||
| + | |||
| + | } | ||
| + | |||
| + | public void print() { | ||
| + | System.out.println(buffer); | ||
| + | System.out.println(" | ||
| + | } | ||
| + | |||
| + | @Override | ||
| + | public void setFooter() { | ||
| + | buffer.append(" | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | <sxh java ; title: ConcreteBuilder> | ||
| + | public class JavaCodeBuilder extends Builder { | ||
| + | |||
| + | private String snippet1 = " | ||
| + | " | ||
| + | " | ||
| + | |||
| + | private String snippet2 = " | ||
| + | " | ||
| + | " | ||
| + | |||
| + | @Override | ||
| + | public void setHeader() { | ||
| + | buffer.append(snippet1); | ||
| + | } | ||
| + | |||
| + | @Override | ||
| + | public void setMessage(String... items) { | ||
| + | |||
| + | buffer.append(" | ||
| + | Stream.of(items).forEach(str -> { | ||
| + | buffer.append(str); | ||
| + | buffer.append(" | ||
| + | }); | ||
| + | buffer.append(" | ||
| + | } | ||
| + | |||
| + | @Override | ||
| + | public void setFooter() { | ||
| + | buffer.append(snippet2); | ||
| + | } | ||
| + | |||
| + | public void save() { | ||
| + | String fileName = " | ||
| + | |||
| + | System.out.println(buffer); | ||
| + | System.out.println(); | ||
| + | System.out.println(fileName + " 로 저장되었습니다." | ||
| + | |||
| + | try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(fileName))){ | ||
| + | bos.write(String.valueOf(buffer).getBytes()); | ||
| + | } catch (Exception e) { | ||
| + | e.printStackTrace(); | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | = Client = | ||
| + | <sxh java> | ||
| + | public class Main { | ||
| + | public static void main(String[] args) { | ||
| + | PlainTextBuilder plainTextBuilder = new PlainTextBuilder(); | ||
| + | construct(plainTextBuilder); | ||
| + | plainTextBuilder.print(); | ||
| + | |||
| + | JavaCodeBuilder javaCodeBuilder = new JavaCodeBuilder(); | ||
| + | construct(javaCodeBuilder); | ||
| + | javaCodeBuilder.save(); | ||
| + | } | ||
| + | |||
| + | private static void construct(Builder concreteBuilder) { | ||
| + | Director plainTextDirector = new Director(concreteBuilder); | ||
| + | plainTextDirector.construct(); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | |||
| + | /* | ||
| + | ==================== | ||
| + | Hello | ||
| + | World! | ||
| + | 안녕? | ||
| + | 세상아 | ||
| + | ==================== | ||
| + | |||
| + | |||
| + | public class JavaCodeBuilder { | ||
| + | public static void main(String[] args) { | ||
| + | System.out.println(" | ||
| + | } | ||
| + | } | ||
| + | |||
| + | JavaCodeBuilder.java 로 저장되었습니다. | ||
| + | */ | ||
| + | </ | ||