FeelingXD

[DesignPattern] λΉŒλ”νŒ¨ν„΄ λ³Έλ¬Έ

μΉ΄ν…Œκ³ λ¦¬ μ—†μŒ

[DesignPattern] λΉŒλ”νŒ¨ν„΄

FeelingXD 2024. 8. 25. 12:20

λΉŒλ” νŒ¨ν„΄ πŸ”¨

λΉŒλ”νŒ¨ν„΄ 은 λ””μžμΈ νŒ¨ν„΄μ€‘ 생성 νŒ¨ν„΄μœΌλ‘œ
생성 κ³Όμ •κ³Ό ν‘œν˜„κ³Όμ •μ„ λΆ„λ¦¬ν•˜κ³  λ‹€μ–‘ν•œ κ΅¬μ„±μ˜
μΈμŠ€ν„΄μŠ€ λ₯Ό λ§Œλ“œλŠ”κ²ƒμ„ λͺ©μ μœΌλ‘œν•©λ‹ˆλ‹€.

λΉŒλ” νŒ¨ν„΄μ˜ κ°œλ…

λΉŒλ” νŒ¨ν„΄μ€ λ³΅μž‘ν•œ 객체듀을 λ‹¨κ³„λ³„λ‘œ 생성 ν•  μˆ˜μžˆλ„λ‘ ν•˜λŠ” νŒ¨ν„΄μž…λ‹ˆλ‹€.

λŒ€ν‘œμ μœΌλ‘œ μ‚¬μš©λ˜λŠ” 생성 νŒ¨ν„΄λ“€

  1. 점측적 μƒμ„±μž νŒ¨ν„΄
  • μƒμ„±μžλ₯Ό λ§€κ°œλ³€μˆ˜μ— 개수만큼 κ΅¬μ„±ν•˜λŠ” νŒ¨ν„΄μ„ μ˜λ―Έν•©λ‹ˆλ‹€.

    class Person{
      private String name;
      private String nickname;
      private String email;
    
      public Person(String name){
          this(name,null,null);
      }
    
      public Person(String name, String nickname){
          this(name,nickname,null)
      }
      public Person(String name, String nickname, String email){
          this(name,nickname,email)
      }
    }
  • λ§€κ°œλ³€μˆ˜κ°€ λ§Žμ•„μ§ˆμˆ˜λ‘ 그만큼 μ»€μŠ€ν…€ μƒμ„±μžλ₯Ό μΆ”κ°€μ μœΌλ‘œ 생성해야 ν•©λ‹ˆλ‹€.

  • λ‚΄λΆ€ν•„λ“œμ— λ™μΌν•œ νƒ€μž…μ˜ ν΄λž˜μŠ€κ°€ μ‘΄μž¬ν•  경우 λͺ¨ν˜Έν•œ ν‘œν˜„μ„ μ•ΌκΈ°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


  1. μžλ°”λΉˆμ¦ˆ νŒ¨ν„΄
  • λ³„λ„μ˜ μƒμ„±μž 없이 빈 객체λ₯Ό μƒμ„±ν•˜κ³  μΈμŠ€ν„΄μŠ€μ˜ ν•„λ“œλ₯Ό μ±„μ›Œμ£ΌλŠ” ν˜•νƒœμ˜ νŒ¨ν„΄μž…λ‹ˆλ‹€.
    μœ„μ˜ 클래슀 μ—μ„œ λ§Œλ“  Person 클래슀λ₯Ό μž¬ν™œμš© ν•˜κ² μŠ΅λ‹ˆλ‹€.

    class Person{
      private String name;
      // 기타 ν•„μš” ν•„λ“œλ“€
      public Person()
    
      public setName(String name){
          this.name= name;
      }
      // 각 ν•„μš”ν•œ ν•„λ“œμ˜ μ„Έν„°λ“€
    }
    

class main{
public static void main(String args[]){
Person person= new Person()
person.setName("μƒˆλ‘œμš΄ 이름");
}
}

- λΆˆν•„μš”ν•œ μƒμ„±μžλ₯Ό μΆ”κ°€μ μœΌλ‘œ μž‘μ„±ν•˜μ§€ μ•Šμ•„λ„ λ˜μ–΄μ„œ μž‘μ„±ν•  μ½”λ“œ λŸ‰μ΄ μ€„μ–΄λ“­λ‹ˆλ‹€.
- `ν•„μˆ˜` 적으둜 μ‚¬μš©λ˜μ•Όν•˜λŠ” ν•„λ“œλ₯Ό 객체 생성 이후 μ΄ˆκΈ°ν™” ν•˜κΈ°μ— μ‹€μˆ˜ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
- ν•„λ“œμ˜ set이 μ—΄λ €μžˆμ–΄ 객체 ν•„λ“œκ°€ λ³€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


### λΉŒλ”νŒ¨ν„΄ μ•Œμ•„λ³΄κΈ° 😊

```Java
class Person{

    private String name;
    private String nickname;
    // private μƒμ„±μžλ₯Ό μ§€μ •ν•˜μ—¬ μƒμ„±μž 생성 방지
    private Person(){}
    public static builder(){
        return new PersonBuilder()
    }
}
// 생성을 λΉŒλ”νŒ¨ν„΄μ—μ„œ λ‹΄λ‹Ήν•˜κ²Œλ©λ‹ˆλ‹€.
class PersonBuilder{

    public PersonBuilder name(String name){
        this.name= name;
        return this
    }

    public PersonBuilder nickname(String nickname){
        this.nickname= nickname
        return this
    }
    public Person build(PersonBuilder builder){
        Person person = new Person()
        // 각 person ν•„λ“œμ„€μ •
        person.name = builder.name
        return person
    } 
    // μ΅œμ’…μ μœΌλ‘œ build λ©”μ„œλ“œλ₯Ό 톡해 Person객체λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
    public Person build(){
        return build(this)
    } 
}

μ‹€μ œ μ‚¬μš©ν•˜λŠ” κ³³μ—μ„œλŠ” λ‹€μŒκ³Ό 같이 μ‚¬μš©λœλ‹€.


public static void main(){
    Person person = Person.Builder()
    .name("이름")
    .build()
}

λΉŒλ”νŒ¨ν„΄μ˜ μž₯점

  • λͺ…μ‹œμ μœΌλ‘œ μ–΄λ–€ν•„λ“œμ— μ–΄λ–€ 값이 λ“€μ–΄κ°ˆμ§€ κ°œλ°œμžκ°€ νŒŒμ•…ν•˜κΈ° μš©μ΄ν•©λ‹ˆλ‹€.
  • μ‹€μ œ μ‚¬μš©ν•˜λŠ” κ°μ²΄μ—μ„œ Setter와 μƒμ„±μžλ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ―€λ‘œμ¨ 객체가 λ³€κ²½λ˜κ±°λ‚˜ μƒμ„±μ‹œ μ‹€μˆ˜κ°€ μ€„μ–΄λ“­λ‹ˆλ‹€.

단점

  • ν•„μˆ˜κ°’μœΌλ‘œ μƒμ„±ν•΄μ•Όν•˜λŠ” ν•„λ“œλ“€μ„ λˆ„λ½ν•  μœ„ν—˜μ΄ μžˆμŠ΅λ‹ˆλ‹€.