์ƒ์„ธ ์ปจํ…์ธ 

๋ณธ๋ฌธ ์ œ๋ชฉ

[์ž๋ฐ”] ์ดํŒฉํ‹ฐ๋ธŒ์ž๋ฐ” : 2. ์ƒ์„ฑ์ž์— ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋งŽ๋‹ค๋ฉด ๋นŒ๋”๋ฅผ ๊ณ ๋ คํ•ด๋ผ

๐Ÿ˜Ž ์ง€์‹ in Action/Java & Kotlin

by :ํ•ดํ”ผ๋ž˜๋น—๐Ÿพ 2023. 10. 17. 19:50

๋ณธ๋ฌธ

์ ์ธต์  ์ƒ์„ฑ์ž ํŒจํ„ด

  • : ( ๋งค๊ฐœ๋ณ€์ˆ˜ ์ˆœ์„œ ๋ฐ”๊ฟ” ๊ฑด๋„ค์ค˜๋„ ๋Ÿฐํƒ€์ž„์— ์•Œ์•„์ฐจ๋ฆฌ์ง€ ๋ชปํ•œ๋‹ค.
class A{
	public A(int a,  int b, int c){
		this.a = a;
		this.b = b;
		this.c = c;
	}
	public A(int a, int b){
		this(a,b,0);
	}
}

์ž๋ฐ” ๋นˆ์ฆˆ ํŒจํ„ด (JavaBeans pattern)

  • ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๊ณ , ์„ธํ„ฐ ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์—ฌ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•
  • : ( ๊ฐ์ฒด ์™„์„ฑ ์ „๊นŒ์ง€ ์ผ๊ด€์„ฑ์ด ๋ฌด๋„ˆ์ง„๋‹ค. ํด๋ž˜์Šค๋ฅผ ๋ถˆ๋ณ€์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์—†๋‹ค. ์Šค๋ ˆ๋“œ ์•ˆ์ •์„ฑ์„ ์–ป์„ ์ˆ˜ ์—†๋‹ค.
  • ⇒ freeze ๋ฉ”์„œ๋“œ? ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜์— ์ทจ์•ฝ

 

๋นŒ๋” ํŒจํ„ด

 

A a = new A.Builder('ae').korean('์—์ด').build(); 
  • ๊ณ„์ธต์ ์œผ๋กœ ์„ค๊ณ„๋œ ํด๋ž˜์Šค์™€ ํ•จ๊ป˜ ์“ฐ๊ธฐ์— ์ข‹๋‹ค
NyPizza pizza = new NyPizza.Builder(SMALL).addTopping(SAUSAGE).addTopping(ONION).build();
Calzone calzone = new Calzone.Builder().addTopping(HAM).sauceInside().build();
  • : ( ์„ฑ๋Šฅ ๋ฌธ์ œ ๋ฐœ์ƒ ๊ฐ€๋Šฅ. IDE์˜ ํž˜์„ ๋ฏฟ๊ณ , ์ƒ์„ฑ์ž๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ์ˆ˜๋„!

 


[  Builder ์‚ฌ์šฉํ•ด์„œ๋งŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ๊ฐ•์ œํ•˜๊ธฐ ]

@Builder ์‚ฌ์šฉ์‹œ, @AllArgsConstructor(access = AccessLevel.PRIVATE)๋ฅผ ์„ค์ •ํ•˜์—ฌ 
๋ชจ๋“  ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ์ƒ์„ฑ์ž๋ฅผ ์ˆจ๊ธด๋‹ค. 


public abstract class Pizza {
	public enum Toping {HAM, MUSHROOM, ONION, PEPPER, SAUSAGE }
	final Set<Topping> toppings;
	abstract static class Builder<T extends Builder<T>>{
		EnumSet<Topping> toppings = EnumSet.noneOf(Topping.class);
		public **T** addTopping(Topping topping){
			toppings.add(Objects.requireNonNull(topping));
			return **self()**;
		}
		abstract Pizza build();
		protected abstract T self();
	}
	Pizza(Builder<?> builder){toppings = builder.toppings.clone();}
}

์œ„์ฒ˜๋Ÿผ ๊ตฌํ˜„์ด ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ƒ์† ๊ด€๊ณ„์—์„œ ๋นŒ๋” ํŒจํ„ด ์ ์šฉ์—๋„ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค.

public abstract class Pizza {
	public enum Toping {HAM, MUSHROOM, ONION, PEPPER, SAUSAGE }
	final Set<Topping> toppings;
	abstract static class Builder<T extends Builder<T>>{
		EnumSet<Topping> toppings = EnumSet.noneOf(Topping.class);
		public **Builder<T>** addTopping(Topping topping){
			toppings.add(Objects.requireNonNull(topping));
			return **this**;
		}
		abstract Pizza build();
		protected abstract T self();
	}
	Pizza(Builder<?> builder){toppings = builder.toppings.clone();}
}

 

 

728x90

๊ด€๋ จ๊ธ€ ๋”๋ณด๊ธฐ