Builder Pattern

Builder Pattern (๋นŒ๋” ํŒจํ„ด)

Builder-Pattern

์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ์—๋Š” ์ƒ์„ฑ์ž(constructor)๊ฐ€ ์ œ๊ณต๋˜๋ฉฐ new ๋ฌธ๋ฒ•์„ ํ†ตํ•ด ์ƒ์„ฑ์ž๋ฅผ ์ด์šฉํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ฐ์ฒด์— ๋„ˆ๋ฌด ๋งŽ์€ ์ƒ์„ฑ์ž๊ฐ€ ์„ ์–ธ๋˜๋ฉด ๊ฐ์ฒด ๋‚ด๋ถ€์— ์žˆ๋Š” ๊ฐ์ฒด ์ƒ์„ฑ ๋กœ์ง์ด ๊ธธ์–ด์ ธ ์ฝ”๋“œ๊ฐ€ ์ง€์ €๋ถ„ํ•ด์ง€๊ณ , ์ฑ…์ž„์ด ๋ถ„๋ฆฌ๋˜์ง€ ์•Š๋Š”๋‹ค.

๋˜ํ•œ, ๊ธฐ์กด ๋ฐฉ์‹์˜ ๊ฐ€์žฅ ์น˜๋ช…์ ์ธ ๋ฌธ์ œ์ ์€, ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ํ•œ ๋ฒˆ์— ์ค€๋น„๋˜์ง€ ์•Š์•„ ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๋งŒ ์ œ๊ณต๋œ ์ƒํƒœ๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํ•ด๋‹น ์ƒ์„ฑ ๊ณผ์ •์ด ์œ ํšจํ•œ์ง€ ํŒ๋‹จํ•˜๋Š” ๋กœ์ง์ด ์—†๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋Ÿฌํ•œ ๊ธฐ์กด ์ƒ์„ฑ์ž์˜ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋นŒ๋” ํŒจํ„ด์ด๋‹ค.

๊ตฌ์„ฑ ์š”์†Œ

  • Director - Builder๋ฅผ ์ด์šฉํ•ด Product๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํด๋ž˜์Šค

  • Builder - Builder์— ๋‹คํ˜•์„ฑ์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค (Builder๊ฐ€ ํ•˜๋‚˜ ๋ฟ์ด๋ผ๋ฉด ์ƒ๋žต ๊ฐ€๋Šฅ)

  • ConcreteBuilder - ๋งŒ๋“ค๊ณ ์ž ํ•˜๋Š” ๊ฐ์ฒด(Product)์— ๋Œ€ํ•ด ์ ์ฆ์ ์œผ๋กœ ๊ฐ’์„ ๋ฐ›๊ณ  ์ด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•˜๋Š” ํด๋ž˜์Šค

  • Product - Builder๊ฐ€ ๋งŒ๋“ค์–ด๋‚ด๋Š”(๋ฐ˜ํ™˜ํ•˜๋Š”) ๊ฒฐ๊ณผ๋ฌผ

๊ตฌํ˜„ ๋ฐฉ๋ฒ•

  • Builder ํด๋ž˜์Šค๋Š” Java์—์„œ๋Š” ์ฃผ๋กœ public static class๋กœ ์„ ์–ธ๋œ๋‹ค.

    public class ProductFactory {
    
    	private String name;
    	private int price;
    
    	public static class Builder {
    		
    	}
    
    	private ProductFactory(Builder builder) {
    		this.name = builder.name;
    		this.price = builder.price;
    	}
    }
  • ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๋Š” ๋ฉ”์†Œ๋“œ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ˜„๋œ๋‹ค.

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

    ์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฒด์ธ์„ ์ด์–ด๊ฐ€ ์ ์ฆ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฑ„์›Œ๋‚˜๊ฐ€๊ธฐ ์œ„ํ•จ์ด๋‹ค.

    // in Director
    Product product = ProductFactory.builder()
    										.name("Milk")
    										.price(2900)
    										.build();
  • Product๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฉ”์†Œ๋“œ build๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ˜„๋œ๋‹ค.

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

    ์™œ ์ด๋ ‡๊ฒŒ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ๊ฐ€? ์ด๋Š” Product ํด๋ž˜์Šค์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ”„๋ผ์ด๋น— ์ƒ์„ฑ์ž๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

    private ProductFactory(Builder builder) {
    	this.name = builder.name;
    	this.price = builder.price;
    }

    ์ด๋Š” ์™ธ๋ถ€์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜๋Š” ์—†์œผ๋‚˜ Product์˜ inner class์ธ Builder์—์„œ๋Š” ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.

    ๋”ฐ๋ผ์„œ Builder์˜ ์‚ฌ์šฉ์ž๋Š” ์ง์ ‘ Product๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜๋Š” ์—†๊ณ  Builder๋ฅผ ํ†ตํ•ด Product๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

Last updated