김호쭈
DevForYou
김호쭈
전체 방문자
오늘
어제
  • 분류 전체보기 (321)
    • • 데이터베이스(DB) (9)
      • __SQL__ (9)
    • •알고리즘(Algorithm ) (117)
      • 문제풀이 (99)
      • 스터디 (14)
      • 알고리즘 팁 (4)
    • •Compter Science (57)
      • Operating System (25)
      • Computer Network (1)
      • Computer Vision (16)
      • Artificial Intelligence (14)
      • Software Technology (1)
    • • 독서 (36)
      • Design Pattern (24)
      • 객체지향의 사실과 오해 (1)
      • Object Oriented Software En.. (11)
    • • 개발 (26)
      • React (3)
      • node.js (6)
      • Django (11)
      • Spring boot (6)
    • • 개발Tip (4)
      • GitHub (0)
    • •프로젝트 (2)
      • 물물 (2)
    • •App (54)
      • 안드로이드 with Kotlin (50)
      • 코틀린(Kotiln) (4)
    • •회고 (8)
    • •취준일기 (3)
    • • 기타 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Remote저장소
  • local저장소
  • GitHubDesktop
  • 깃허브데스크탑
  • 원격저장소
  • KMU_WINK
  • ㄱ
  • 로컬저장소

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
김호쭈

DevForYou

[디자인패턴-생성패턴] 빌더 패턴(Builder Pattern)
• 독서/Design Pattern

[디자인패턴-생성패턴] 빌더 패턴(Builder Pattern)

2022. 9. 17. 16:20

# 설명

객체를 생성(인스턴스화)하는 정통적인 방법은 두가지가 있다.

  • 생성자
// 생성자

class User {
	private  String name;
    private String id;
    private String pwd;
    
    User(String name){
    	this.name = name;
    }
    
    User(String name, String id){
    	this.name = name;
        this.id = id;
    }
    
    User(String name, String id, String pwd){
    	this.name = name;
        this.id = id;
        this.pwd = pwd;
    }
	

}
  • setter를 사용한 java beans 패턴
// 생성자

class User {
	private  String name;
    private String id;
    private String pwd;
    
    public void setName(String name){
    	this.name = name;
    }
    
    public void setId(String id){
    	this.id = id;
    }
    
    public void setPwd(String pwd){
    	this.pwd = pwd;
    }
}

두가지 방법은 우리가 흔히 사용하던 방법이다. 각각의 생성 방식에는 문제점이 존재한다.

생성자 생성방식에서는

  • 프로퍼티가 많아질 경우 그만큼의 프로퍼티를 만들어야 한다.
  • 프로퍼티가 많아질 경우 인자의 순서가 헷갈린다.

setter 방식에서는

  • setter가 존재하기 때문에 프로퍼티가 가변적이다. 즉 언제든 User객체의의 프로퍼티를 setter를 통해서 바꿀 수 있다.

객체의 생성결정이 한번에 일어나지 않는다.

 

이러한 문제를 해결하기 위해 빌더패턴(Builder)가 존재한다.

빌더 패턴을 간단히 설명하면 빌더를 통해 인자를 결정하고 build키워드를 통해 최종적으로 생성하고 싶은 객체를 인스턴스화 시킨다.

여러가지 프로퍼티를 만들 필요도 없으며, 인자의 순서를 헷갈려하지 않아도 된다. 또한 불변성(immutable)을 지니게 할 수 있다. 나아가 필수 생성인자와 옵셔널한 인자를 생성하게 할 수 있다.

빌더는 클래스내 스태틱(static) 클래스로 만들어, builder자체를 만들지 않고도 생성할 수 있게 해준다.

# 코드

package builder;

public class User {
    private String name;
    private int age;
    private String nickname;
    private String id;
    private String pwd;

    private User(Builder builder){
        this.name = builder.name;
        this.age = builder.age;
        this.nickname = builder.nickname;
        this.id = builder.id;
        this.pwd = builder.pwd;
    }

    @Override
    public String toString() {
        return "name : " + name + "\nage : " + age + "\nnickname : " + nickname + "\nid : " + id + "\npwd : " + pwd;
    }

    public static class Builder{
        private String name;
        private int age;
        private String nickname;
        private String id;
        private String pwd;

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

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

        public Builder nickname(String nickname) {
            this.nickname = nickname;
            return this;
        }

        public Builder id(String id) {
            this.id = id;
            return this;
        }

        public Builder pwd(String pwd) {
            this.pwd = pwd;
            return this;
        }

        public User build(){
            return new User(this);
        }
    }

}

 

# 테스트

package builder;

public class Test {
    public static void main(String[] args) {
        User hojun = new User.Builder()
                .name("hojun")
                .nickname("hacker")
                .id("testId_123")
                .age(24)
                .pwd("password123")
                .build();

        System.out.println(hojun);
        System.out.println("======@@@@@======");

        User bob = new User.Builder()
                .name("bob")
                .id("bobtree1")
                .pwd("bob1234")
                .build();

        System.out.println(bob);


    }
}

 

저작자표시 (새창열림)

'• 독서 > Design Pattern' 카테고리의 다른 글

[디자인패턴-위임/팩토리패턴] 팩토리 메소드 패턴 (Factory-Method Pattern)  (2) 2022.09.20
[디자인패턴-위임패턴] 템플릿 메서드 패턴(Template Method)  (0) 2022.09.18
[디자인패턴-생성패턴] 추상팩토리 패턴(Abstract-Factory pattern)  (0) 2022.09.17
[디자인패턴-생성패턴] 프로토타입 패턴(Prototype Pattern)  (0) 2022.09.16
[디자인패턴-생성패턴] 싱글톤 패턴(Singleton Pattern)  (0) 2022.09.16
    '• 독서/Design Pattern' 카테고리의 다른 글
    • [디자인패턴-위임/팩토리패턴] 팩토리 메소드 패턴 (Factory-Method Pattern)
    • [디자인패턴-위임패턴] 템플릿 메서드 패턴(Template Method)
    • [디자인패턴-생성패턴] 추상팩토리 패턴(Abstract-Factory pattern)
    • [디자인패턴-생성패턴] 프로토타입 패턴(Prototype Pattern)
    김호쭈
    김호쭈
    공부하고 정리하고 기록하기

    티스토리툴바