Skip to content

Latest commit

Β 

History

History
141 lines (110 loc) Β· 4.14 KB

builder-pattern.md

File metadata and controls

141 lines (110 loc) Β· 4.14 KB
layout title catalog date subtitle header-img tags
post
μΈν…”λ¦¬μ œμ΄λ‘œ Builder Pattern μ‰½κ²Œ κ΅¬ν˜„ν•˜κΈ°
true
2018-01-17 17:25:21 -0800
IntelliJ
Builder Pattern

이미 λ§Žμ€ 뢄듀이 λΉŒλ” νŒ¨ν„΄ κ΄€λ ¨ν•΄μ„œ ν¬μŠ€νŒ…μ„ 잘 μ •λ¦¬ν•΄μ£Όμ…”μ„œ λΉŒλ” νŒ¨ν„΄μ— λŒ€ν•΄μ„œ μ„€λͺ… ν•΄μ£ΌκΈ° λ³΄λ‹€λŠ” μΈν…”λ¦¬μ œμ΄ ν”ŒλŸ¬κ·ΈμΈμ„ ν™œμš©ν•΄μ„œ μ’€ μ‰½κ²Œ μ‚¬μš©ν•  수 μžˆλŠ” νŒμ„ ν¬μŠ€νŒ…μ„ ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€. λ¬Όλ‘  Lombok을 ν™œμš©ν•΄μ„œ λΉŒλ”λ₯Ό μ†μ‰½κ²Œ μ‚¬μš©ν•  μˆ˜μžˆμ§€λ§Œ Lombok을 μ‚¬μš©ν•˜μ§€ μ•Šκ³ λ„ μ‰½κ²Œ λ§Œλ“€ 수 μžˆλŠ” 방법을 μ†Œκ°œν•΄λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€.

Builder Generator ν”ŒλŸ¬κ·ΈμΈ μ„€μΉ˜

Preferences -> Plugins -> Browse Repositories -> Builder Generator 검색 및 μ„€μΉ˜

λΉŒλ”ν΄λž˜μŠ€ 생성 방법

  • command + n ν‚€λ₯Ό 눌러 Builder λ₯Ό μ„ νƒν•©λ‹ˆλ‹€.
  • μœ„ ν™”λ©΄μ²˜λŸΌ Builder 클래슀λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

λΉŒλ” νŒ¨ν„΄ 간단 μ†Œκ°œ

Member 객체

public class Member {

    private String name; //mandatory
    private String email; //mandatory
    private String mobile; //optional
    private String address; //optional
    private String password; //optional
    private String state; //optional
    private int age; //optional

    //Getter, Setter, Constructor
}

문제점

Member member = new Member(name, email, mobile ....)
  • 객체λ₯Ό 생성할 λ•Œ μ–΄λ–€ 값이 ν•„μˆ˜ 값인지 μ˜΅μ…˜ 값인지 인지 ν•˜κΈ° μ–΄λ ΅λ‹€.
  • Member member = new Member(name, email, mobile ....) μƒμ„±μžλ‘œ 객체λ₯Ό 생성 ν•  경우 λ°˜λ“œμ‹œ μˆœμ„œλ₯Ό λ§žμΆ”μ•Ό ν•œλ‹€.
  • Setter둜 생성할 경우 Setter λ©”μ†Œλ“œλ₯Ό 많이 μž‘μ„±ν•΄μ•Όν•œλ‹€.

ν•΄κ²°

  • λΉŒλ” νŒ¨ν„΄μ„ μ‚¬μš©ν•΄μ„œ ν•„μˆ˜ 값은 μƒμ„±μžλ‘œ μ˜΅μ…˜ 값은 λΉŒλ” 클래슀둜 μž‘μ„±ν•œλ‹€.

MemberBuilder.class

public final class MemberBuilder {
    private final String name; //mandatory
    private final String email; //mandatory
    private String mobile; //optional
    private String address; //optional
    private String password; //optional
    private String state; //optional
    private int age; //optional

    private MemberBuilder(String name, String email) {
        this.name = name;
        this.email = email;
    }

    public static MemberBuilder aMember(String name, String email) {
        return new MemberBuilder(name, email);
    }

    public MemberBuilder withMobile(String mobile) {
        this.mobile = mobile;
        return this;
    }

    public MemberBuilder withAddress(String address) {
        this.address = address;
        return this;
    }

    public MemberBuilder withPassword(String password) {
        this.password = password;
        return this;
    }

    public MemberBuilder withState(String state) {
        this.state = state;
        return this;
    }

    public MemberBuilder withAge(int age) {
        this.age = age;
        return this;
    }

    public Member build() {
        Member member = new Member();
        member.setName(name);
        member.setEmail(email);
        member.setMobile(mobile);
        member.setAddress(address);
        member.setPassword(password);
        member.setState(state);
        member.setAge(age);
        return member;
    }
}
  • ν•„μˆ˜ 맴버 ν•„λ“œμΈ name, email에 final을 μΆ”κ°€ν•©λ‹ˆλ‹€.
  • μƒμ„±μž νŒŒλΌλ―Έν„°μ— name, email μΆ”κ°€ν•©λ‹ˆλ‹€.
  • μžλ™μœΌλ‘œ λ§Œλ“€μ–΄μ€€ name, email의 with λ©”μ†Œλ“œλ₯Ό 제거 ν•©λ‹ˆλ‹€.

객체 생성

Member member = MemberBuilder
                .aMember("Yun", "cheese10yun@gmail.com")
                .withAddress("address")
                .withAge(20)
                .withMobile("010-XXXX-XXXX")
                .build();

  • ν•„μˆ˜ 값은 μƒμ„±μžλ‘œ λ„˜κ²¨ ν•„μˆ˜ 값을 λ„˜κ²¨ ν•„μˆ˜ 값을 인지 ν•˜κΈ° μ‰½μŠ΅λ‹ˆλ‹€.
  • μ˜΅μ…˜ 값듀은 μˆœμ„œμ— 상관 없이 .with...() λ©”μ†Œλ“œλ‘œ μ΄μ–΄λ‚˜κ°‘λ‹ˆλ‹€.

κ²°λ‘ 

객체λ₯Ό μ•ˆμ „ν•˜κ²Œ μƒμ„±ν•˜κ³  μ‰½κ²Œ 생성할 수 μžˆλ‹€λŠ” μž₯점이 μžˆμŠ΅λ‹ˆλ‹€. κ°œλ…λ„ κ·Έλ ‡κ²Œ 어렡지 μ•Šμ•„ κ°€μž₯ λ§Œλ§Œν•˜κ²Œ λ„μž…ν•΄ λ³Όλ§Œν•œ λ””μžμΈ νŒ¨ν„΄μΈκ±° κ°™μŠ΅λ‹ˆλ‹€.