자바프로그래밍 빌더패턴

최주영·2023년 3월 29일
0

자바

목록 보기
22/30
post-custom-banner

✅ 빌더패턴

합 객체의 생성 과정과 표현 방법을 분리하여 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 하는 패턴

  • 밑에 예제는 클래스의 필드가 많을 경우 매개변수 있는 생성자를 일일이 모든 경우를 다
    만들 수 없는 경우에 빌더 패턴 사용하면 원하는 값만 입력시 나머지 초기값은 기본값으로 정해진다.

// 예시문제
// StudentDao 클래스
public class StudentDao {
	
	private static List<Student> students = new ArrayList(); 
	
	public StudentDao() {}
	
	static {  // Main문보다 Static 영역 먼저  실행
		for(int i=0; i<100; i++) {
			// 빌더패턴으로 이용해서 객체를 생성해보자 (만들고 싶은 타입으로 객체생성 가능)
			students.add(Student.builder()
					.stdNo(i+1)
					.name("test"+i)
					.age((int)(Math.random()*50)+10)
					.height(Math.random()*(190-150)+150)
					.gender(i%2==0 ? Gender.M : Gender.F)
					.address("test"+i)
					.build());
		}
	}
	
	public static List<Student> getStudents(){ 
		return StudentDao.students;
	}
    
    
    
    //StreamController
    	public static void main(String[] args) {
		//Builder 패턴으로 객체 생성하기
		Student s = new Student();
		s = Student.builder()
				.stdNo(1)
				.name("유병승")
				.age(19)
				.height(180.5)
				.gender(Gender.M)
				.address("경기도 시흥시")
				.build();  // 리턴값 Student로 받음

		//이름하고 번호만 만들고 싶을 때
		s = Student.builder().stdNo(2).name("최주영").build();
		System.out.println(s);
	}
    
    
     
     
    // Student 
    public class Student {
	private long stdNo;
	private String name;
	private int age;
	private double height;
	private Gender gender;  // M,f
	private String address;
	
	public Student() {}

	public Student(long stdNo, String name, int age, double height, Gender gender, String address) {
		super();
		this.stdNo = stdNo;
		this.name = name;
		this.age = age;
		this.height = height;
		this.gender = gender;
		this.address = address;
	}

	public long getStdNo() {
		return stdNo;
	}

	public void setStdNo(long stdNo) {
		this.stdNo = stdNo;
	}

	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 double getHeight() {
		return height;
	}

	public void setHeight(double height) {
		this.height = height;
	}

	public Gender getGender() {
		return gender;
	}

	public void setGender(Gender gender) {
		this.gender = gender;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}


	// Gender 클래스
    public enum Gender { // 상수로 구성된 enum 클래스 
		M,F
	}


	//빌더 패턴으로 클래스 생성하는 로직 구현하기
	//내부 클래스를 활용하여 구현함.
	public static class Builder{  // 내부 클래스 생성
		private long stdNo;
		private String name;
		private int age;
		private double height;
		private Gender gender;
		private String address;
		
		public Builder stdNo(long val) {
			stdNo = val;
			return this;
		}
		
		public Builder name(String val) {
			name = val;
			return this;
		}
		
		public Builder age(int val) {
			age = val;
			return this;
		}
		
		public Builder height(double val) {
			height = val;
			return this;
		}
		
		public Builder gender(Gender val) {
			gender = val;
			return this;
		}
		
		public Builder address(String val) {
			address = val;
			return this;
		}
		public Student build() {  // Builder에 값 다 넣고 마지막에 build 호출
			return new Student(stdNo,name,age,height,gender,address);
		}
	}

	
	public static Student.Builder builder() {
		return new Student.Builder();
	}
	
	
}
profile
우측 상단 햇님모양 클릭하셔서 무조건 야간모드로 봐주세요!!
post-custom-banner

0개의 댓글