개발자의 하루

빌더 패턴

( 업데이트: )

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

생성자 오버로딩

예제

class Pizza {
  private $dough;
  private $sauce;
  private $topping;

  public function setDough($dough) {
    $this->dough = $dough;
  }

  public function setSauce($sauce) {
    $this->sauce = $sauce;
  }

  public function setTopping($topping) {
    $this->topping = $topping;
  }
}

/** Abstract builder **/
abstract class PizzaBuilder {
  protected $pizza;

  public function __construct() {
    $this->pizza = new Pizza();
  }

  public function getPizza() {
    return $this->pizza;
  }

  abstract function buildDough();
  abstract function buildSauce();
  abstract function buildTopping();
}

/** Concrete builder **/
class SpicyPizza extends PizzaBuilder {
  public function buildDough() {
    $this->pizza->setDough('crispy');
  }

  public function buildSauce() {
    $this->pizza->setSauce('hot');
  }

  public function buildTopping() {
    $this->pizza->setTopping('pepperoni+salami');
  }
}

/** Director **/
class Chef {
  private $pizza_builder;

  public function setPizzaBuilder(PizzaBuilder $pizza_builder) {
    $this->pizza_builder = $pizza_builder;
  }

  public function cookPizza() {
    $this->pizza_builder->buildDough();
    $this->pizza_builder->buildSauce();
    $this->pizza_builder->buildTopping();
  }

  public function getPizza() {
    return $this->pizza_builder->getPizza();
  }
}

// Customer orders a Pizza
$chef = new Chef();

$order = new SpicyPizza();
$chef->setPizzaBuilder($order);
$chef->cookPizza();
$pizza = $chef->getPizza();

print_r($pizza);

빌더 패턴은 복잡한 객체를 생성하는 방법을 정의하는 클래스와 표현하는 방법을 정의하는 클래스를 별도로 분리하여, 서로 다른 표현이라도 이를 생성할 수 있는 동일한 절차를 제공하는 패턴입니다. 빌더 패턴은 생성해야 되는 객체가 Optional한 속성을 많이 가질 때 빛을 발휘합니다.

빌더 패턴은 생성 패턴중 하나이다.

생성패턴은 인스턴스를 만드는 절차를 추상화하는 패턴입니다. 생성패턴에 속하는 패턴들은 객체를 생성, 합성하는 방법이나 객체의 표현방법을 시스템과 분리해줍니다.

생성 패턴은 시스템이 상속보다 복합방법을 사용하는 방향으로 진화되어 가면서 더 중요해지고 있습니다.

생성 패턴에서는 중요한 두가지 이슈가 있습니다.

  1. 생성 패턴은 시스템이 어떤 Concrete Class를 사용하는지에 대한 정보를 캡슐화합니다.
  2. 생성 패턴은 이들 클래스의 인스턴스들이 어떻게 만들고 어떻게 결합하는지에 대한 부분을 완전히 가려줍니다.

쉬운 말로 정리하자면, 생성 패턴을 이용하면 무엇이 생성되고, 누가 이것을 생성하며, 이것이 어떻게 생성되는지, 언제 생성할 것인지 결정하는데 유연성을 확보할 수 있게 됩니다.