[Effective Java] 챕터2. Builder 패턴 사용하기

Posted by 김성철

Effective Java - 챕터2. Builder 패턴 사용하기

https://github.com/kkimsungchul/study/blob/master/Spring%20Boot/%5BSpring%20Boot%5D%20lombok%20%EC%82%AC%EC%9A%A9.txt  
위의 링크를 보고 lombok을 세팅하면 굳이 아래와 같이 builder 을 가진 클래스를 생성하지 않고  
Builder 패턴을 사용할 수 있음  

Main 클래스

=================================================================================================================  
package EffectiveJava.builder_2;  
  
public class BuilderTest {  
	public static void main(String[]args){  
		UserVO userVO = UserVO  
				.builder()  
				.setAge(33)  
				.setName("김성철")  
				.build();  
		System.out.println(userVO);  
  
		MemberVO m = new MemberVO.Builder()  
				.setEmail("메일주소")  
				.setPassword("비밀번호")  
				.setUsername("김성철")  
				.build();  
  
		BoardVO b = new BoardVO.Builder()  
				.setContent("내용")  
				.setTitle("제목")  
				.setSeq(1)  
				.setWriter("작성자")  
				.build();  
		System.out.println("####");  
		System.out.println(b.toString());  
	}  
}  
  
=================================================================================================================  

Builder 패턴을 적용한 UserVO

=================================================================================================================  
package EffectiveJava.builder_2;  
  
public class UserVO {  
  
	private String name;  
	private int age;  
  
	public UserVO(String name, int age) {  
		this.name = name;  
		this.age = age;  
	}  
	public static Builder builder() {  
		return new Builder();  
	}  
  
	@Override  
	public String toString() {  
		return "UserVO{" +  
				"name='" + name + '\'' +  
				", age=" + age +  
				'}';  
	}  
  
	static class Builder{  
  
		private String name;  
		private int age;  
  
		public Builder(){}  
  
		public Builder setName(String name){  
			this.name = name;  
			return this;  
		}  
		public Builder setAge(int age){  
			this.age = age;  
			return this;  
		}  
  
		public UserVO build(){  
			return new UserVO(name,age);  
		}  
  
	}  
}  
  
=================================================================================================================  

Builder 패턴을 적용한 MemberVO

=================================================================================================================  
  
package com.sungchul.equals;  
  
import java.util.Objects;  
  
public class MemberVO {  
	private String username;  
	private String email;  
	private String password;  
  
	private MemberVO(Builder builder) {  
		this.username = builder.username;  
		this.email = builder.email;  
		this.password = builder.password;  
	}  
  
	public String getUsername() {  
		return username;  
	}  
  
	public String getEmail() {  
		return email;  
	}  
  
	public String getPassword() {  
		return password;  
	}  
  
	public static class Builder {  
		private String username;  
		private String email;  
		private String password;  
  
		public Builder setUsername(String username) {  
			this.username = username;  
			return this;  
		}  
  
		public Builder setEmail(String email) {  
			this.email = email;  
			return this;  
		}  
  
		public Builder setPassword(String password) {  
			this.password = password;  
			return this;  
		}  
  
		public MemberVO build() {  
			return new MemberVO(this);  
		}  
	}  
  
	@Override  
	public boolean equals(Object o) {  
		if (this == o) return true;  
		if (o == null || getClass() != o.getClass()) return false;  
		MemberVO memberVO = (MemberVO) o;  
		return Objects.equals(username, memberVO.username) &&  
				Objects.equals(email, memberVO.email) &&  
				Objects.equals(password, memberVO.password);  
	}  
  
	@Override  
	public int hashCode() {  
		return Objects.hash(username, email, password);  
	}  
}  
=================================================================================================================  

Builder 패턴을 적용한 Board VO

=================================================================================================================  
  
package EffectiveJava.builder_2;  
  
public class BoardVO {  
  
	private int seq;  
	private String title;  
	private String content;  
	private String writer;  
  
	public BoardVO(Builder builder){  
		this.title = builder.title;  
		this.content = builder.content;  
		this.seq = builder.seq;  
		this.writer = builder.writer;  
	}  
  
	@Override  
	public String toString() {  
		return "BoardVO{" +  
				"seq=" + seq +  
				", title='" + title + '\'' +  
				", content='" + content + '\'' +  
				", writer='" + writer + '\'' +  
				'}';  
	}  
  
	public static class Builder{  
		private int seq;  
		private String title;  
		private String content;  
		private String writer;  
  
		public Builder setSeq(int seq){  
			this.seq = seq;  
			return this;  
		}  
  
		public Builder setTitle(String title){  
			this.title = title;  
			return this;  
		}  
  
		public Builder setContent(String content){  
			this.content = content;  
			return this;  
		}  
  
		public Builder setWriter(String writer){  
			this.writer = writer;  
			return this;  
		}  
  
		public BoardVO build(){  
			return new BoardVO(this);  
		}  
  
	}  
  
}  
  
=================================================================================================================  

빌더 패턴을 적용한 Person 클래스

======================================================================================================  
public class Person {  
  
	private String name;  
	private int age;  
	private String address;  
	private String sex;  
	private boolean marry;  
  
	private Person(Builder builder){  
		this.name = builder.name;  
		this.age = builder.age;  
		this.address = builder.address;  
		this.sex = builder.sex;  
		this.marry = builder.marry;  
	}  
  
	public String getName() {  
		return name;  
	}  
  
	public void setName(String name) {  
		this.name = name;  
	}  
  
	public int getAge() {  
		return age;  
	}  
  
	public void setAge(int age) {  
		this.age = age;  
	}  
  
	public String getAddress() {  
		return address;  
	}  
  
	public void setAddress(String address) {  
		this.address = address;  
	}  
  
	public String getSex() {  
		return sex;  
	}  
  
	public void setSex(String sex) {  
		this.sex = sex;  
	}  
  
	public boolean isMarry() {  
		return marry;  
	}  
  
	public void setMarry(boolean marry) {  
		this.marry = marry;  
	}  
  
	@Override  
	public String toString() {  
		return "Person{" +  
				"name='" + name + '\'' +  
				", age=" + age +  
				", address='" + address + '\'' +  
				", sex='" + sex + '\'' +  
				", marry=" + marry +  
				'}';  
	}  
  
	public static class Builder{  
		private String name;  
		private int age;  
		private String address;  
		private String sex;  
		private boolean marry;  
  
		public Builder setName(String name){  
			this.name = name;  
			return this;  
		}  
  
		public Builder setAge(int age){  
			this.age = age;  
			return this;  
		}  
  
		public Builder setAddress(String address){  
			this.address = address;  
			return this;  
		}  
  
		public Builder setSex(String sex){  
			this.sex = sex;  
			return this;  
		}  
  
		public Builder setMarry(boolean marry){  
			this.marry = marry;  
			return this;  
		}  
  
		public Person build(){  
			return new Person(this);  
		}  
  
	}  
}  
  
======================================================================================================