본문 바로가기

Software Architect

[Design Pattern] Builder Pattern

Builder Pattern

개요

  • 2가지 종류의 Builder Pattern 존재
    > Effective Java의 Builder Pattern = 생성자 인자가 많을 때
    > GoF의 Builder Pattern             = 생성 절차가 복잡할 때

구현 방법 - Java

public class main {
    public static void main(String[] args) {

//      Cut gunCut = new Cut("군인컷", 2, 1, 1);                          // [1]
//    	Cut gunCut = new Cut();                                           // [2]
//    	gunCut.setStyle("군인컷");
//    	gunCut.setFront(2);
//    	gunCut.setBack(1);
//    	gunCut.setSide(1);
//    	gunCut.status();

    	Cut gunCut = new Cut().setStyle("군인컷");
    	Cut c = Cut.builder()                                             // [3]
                .setStyle("군인컷")
      	        .setFront(2)
    	        .setBack(1)
    	        .setSide(1);
    	gunCut.status();

    }
}

class Cut {
	private String Style;
	private int front;
	private int back;;
	private int side;
	static public Cut builder() {
		return new Cut();
	}	
	public Cut setStyle(String name ) { this.Style = name;  return this;} // [4]
	public Cut setFront(int    front) { this.front = front; return this;}
	public Cut setBack (int    back ) { this.back  = back ; return this;}
	public Cut setSide (int    side ) { this.side  = side ; return this;}
	public void status () {
		System.out.println("Style ="+Style);
		System.out.println("Front ="+front);
		System.out.println("Back  ="+back );
		System.out.println("Side  ="+side );
	}
}
  • [1] Design pattern이 적용되지 않은 경우 적용 방법 - 1
  • [2] 가독성을 높여서 Attribute를 Setting 하는 method 로 구현
  • [3] Design pattern 적용 후 중복요소 제거된 부분
  • [4] return 을 통해서 코드 개선

 

 구현 방법 - Python

class Cut():
    def __init__(self, *, style, front, back, side):
        self.__style = style
        self.__front = front
        self.__back  = back
        self.__side  = side
        
    @property
    def style(self):
        return self.__style
    
    @property 
    def front(self):
        return self.__front

    @property 
    def back(self):
        return self.__back

    @property 
    def side(self):
        return self.__side


    def status(self):
        print("Style =", self.__style)
        print("front =", self.__front)
        print("back  =", self.__back)
        print("side  =", self.__side )


cut = Cut(style="Solder", front=1, back=1, side=1)
cut.status()
  • Python에서는 큰 의미 없음