-
객체 생성 : 빌더 패턴 ( Builder Pattern )Programming/패턴 2020. 9. 22. 01:58
GOF의 디자인 패턴 중 빌더 패던에 관한 내용.
정의
복잡한 객체의 생성 과정과 표현 방법을 분리하여 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 하는 패턴
구조
- Builder : 추상 인터페이스를 정의
- ConcreteBuilder : 인터페이스들을 구현하며 각 부품을 모아서 결과로 정의하고 관리한다.
- Director : 인터페이스를 사용하는 객체를 합성.
- Product : 복합적인 객체를 표현함.
예제코드 ( 위키참고 )
#include <iostream> // Product.. class Pizza { private: std::string dough; std::string sauce; std::string topping; public: Pizza(); ~Pizza(); void SetDough(const std::string& d) { dough = d; } void SetSauce(const std::string& s) { sauce = s; } void SetTopping(const std::string& t) { topping = t; } void ShowPizza() { std::cout<< "Dough : " << dough << std::endl; std::cout<< "Sauce : " << sauce << std::endl; std::cout<< "Topping : " << topping << std::endl; } }; // Abstrct Builder class PizzaBuilder { protected: std::auto_ptr<Pizza> pizza; public: PizzaBuilder(); virtual ~PizzaBuilder(); std::auto_ptr<Pizza> GetPizza() { return pizza; } void createNewPizzaProduct() { pizza.reset (new Pizza); } virtual void buildDough() = 0; virtual void buildSauce() = 0; virtual void buildTopping() = 0; }; // ConcreteBuilder class HawaiianPizzaBuilder : public PizzaBuilder { public: HawaiianPizzaBuilder() : PizzaBuilder() {} ~HawaiianPizzaBuilder(){} void buildDough() { pizza->SetDough("cross"); } void buildSauce() { pizza->SetSauce("mild"); } void buildTopping() { pizza->SetTopping("ham and pineapple"); } }; // ConcreteBuilder class SpicyPizzaBuilder : public PizzaBuilder { public: SpicyPizzaBuilder() : PizzaBuilder() {} ~SpicyPizzaBuilder() {} void buildDough() { pizza->SetDough("pan baked"); } void buildSauce() { pizza->SetSauce("hot"); } void buildTopping() { pizza->SetTopping("pepperoni and salami"); } }; // Director class Waiter { private: PizzaBuilder* pizzaBuilder; public: Waiter() : pizzaBuilder(NULL) {} ~Waiter() { } void SetPizzaBuilder(PizzaBuilder* b) { pizzaBuilder = b; } std::auto_ptr<Pizza> GetPizza() { return pizzaBuilder->GetPizza(); } void ConstructPizza() { pizzaBuilder->createNewPizzaProduct(); pizzaBuilder->buildDough(); pizzaBuilder->buildSauce(); pizzaBuilder->buildTopping(); } }; // A customer ordering a pizza. int main() { Waiter waiter; HawaiianPizzaBuilder hawaiianPizzaBuilder; waiter.SetPizzaBuilder (&hawaiianPizzaBuilder); waiter.ConstructPizza(); std::auto_ptr<Pizza> pizza = waiter.GetPizza(); pizza->ShowPizza(); SpicyPizzaBuilder spicyPizzaBuilder; waiter.SetPizzaBuilder(&spicyPizzaBuilder); waiter.ConstructPizza(); pizza = waiter.GetPizza(); pizza->ShowPizza(); return EXIT_SUCCESS; }
참고자료
https://ko.wikipedia.org/wiki/빌더_패턴
http://refactoring.guru/design-patterns/builder
반응형'Programming > 패턴' 카테고리의 다른 글
객체 생성 : 프로토타입 패턴 ( Prototype Pattern ) (0) 2020.09.26 UML 관계 종류 (0) 2020.09.22 객체 생성 : 추상 팩토리 패턴 ( Abstract Factory Pattern ) (0) 2020.09.04 객체 생성 : 싱글턴 패턴 ( Singleton Pattern ) (0) 2020.05.04 객체 행동 : 전략 패턴 ( Strategy Pattern ) - 정책(Policy) (0) 2020.05.04