본문 바로가기
Development/DesignPatten

[디자인패턴] DesignPattern02 - Builder

by 푸민 2015. 8. 8.
반응형

 

안녕하세요 푸민입니다.

이번에는 디자인 패턴에서 빌더에 대해서 알아보겠습니다.

빌더란 말 그대로의 뜻으로, 특정 객체를 생성하는 것입니다.

빌더라는 클래스를 정의함으로 인해서 어떤 식으로 객체를 생성할지 구조를 잡을 수 있습니다.

 

순서

1. 피자라는 클래스를 생성한다.

- 피자는 도우, 소스, 토핑 변수를 가지고 각 셋 메소드와 셋팅된 것을 출력하는 메소드를 가지고 있습니다.

 

2. 피자 빌더 클래스를 생성한다.

- 피자 빌터는 비자 변수를 가지며, 피자 생성, 피자 가져오기를 가진다.

- 추상 메소드로 도우, 소스, 토핑 설정을 작성한다.

 

3. 피자 빌더를 상속 받은 부산 빌더와 서울 빌더 클래스를 생성한다.

- 추상 메소드(설정 메소드)들을 오버라이드 하여 각 지역에 맞는 피자 설정을 해준다.

 

4. 요리 클래스를 생성한다.

- 피자 빌더 변수(서울 빌더와 부산 빌더로 다운 캐스팅이 가능)를 가지며 각 빌더를 셋팅할 수 있고, 셋팅한 빌더로 피자를 생성할 수 있는 메소드와, 가져오기 메소드를 만든다.

 

소스 나름 안드로이드에서 테스트한... ㅠ

public class MainActivity extends Activity {

private Cook cook;
private PizzaBuilder busanPizzaBuilder;
private PizzaBuilder seoulPizzaBuilder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
 cook = new Cook();
         busanPizzaBuilder = new BusanPizzaBuilder();
         seoulPizzaBuilder = new SeoulPizzaBuilder();

         findViewById(R.id.btn1).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
cook.setPizzaBuilder(seoulPizzaBuilder);
        cook.constructPizza();
        cook.getPizza().print();
}
});

         findViewById(R.id.btn2).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
cook.setPizzaBuilder(busanPizzaBuilder);
        cook.constructPizza();
        cook.getPizza().print();
}
});
}
//피자
class Pizza {
private String dough = "";
private String sauce = "";
private String topping = "";

public void setDough(String dough) {
this.dough = dough;
}

public void setSauce(String sauce) {
this.sauce = sauce;
}

public void setTopping(String topping) {
this.topping = topping;
}
public void print(){
Toast.makeText(getApplicationContext(), dough + " " + sauce + " " + topping + "으로 만들어짐", Toast.LENGTH_SHORT).show();
}
}

//피자 만들기
abstract class PizzaBuilder {
protected Pizza pizza;

public Pizza getPizza() {
return pizza;
}

public void createNewPizzaProduct() {
pizza = new Pizza();
}

public abstract void buildDough();

public abstract void buildSauce();

public abstract void buildTopping();
}

//부모의 피자 객체에 셋팅함
class BusanPizzaBuilder extends PizzaBuilder {
public void buildDough() {
pizza.setDough("부산빵");
}

public void buildSauce() {
pizza.setSauce("부산소스");
}

public void buildTopping() {
pizza.setTopping("부산토핑");
}
}

class SeoulPizzaBuilder extends PizzaBuilder {
public void buildDough() {
pizza.setDough("서울빵");
}

public void buildSauce() {
pizza.setSauce("서울소스");
}

public void buildTopping() {
pizza.setTopping("서울토핑");
}
}

//요리하기
class Cook {
private PizzaBuilder pizzaBuilder;

//미리설정한 피자 설정하기
public void setPizzaBuilder(PizzaBuilder pb) {
pizzaBuilder = pb;
}

public Pizza getPizza() {
return pizzaBuilder.getPizza();
}

//설정한 피자 만들기
public void constructPizza() {
pizzaBuilder.createNewPizzaProduct();
pizzaBuilder.buildDough();
pizzaBuilder.buildSauce();
pizzaBuilder.buildTopping();
}
}

}

 

반응형

댓글