Builder pattern
Encyclopedia
|
| Tutorials | Encyclopedia | Dictionary | Directory |
|
Builder pattern
The Builder Pattern is a software design pattern. The intention is to separate the construction of a complex object from its representation so that the same construction process can create different representations. Often, the Builder Pattern is used to build Products in accordance to the Composite pattern, a structure pattern.
Class DiagramBuilderAbstract interface for creating objects(product). Concrete BuilderProvide implementation for Builder. Construct and assemble parts to build the objects. DirectorThe Director class is responsible for managing the correct sequence of object creation. It receives a Concrete Builder as a parameter and executes the necessary operations on it. ProductThe complex object under construction. Useful tips
ExamplesJava
/** "Product" */
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;
}
}
/** "Abstract Builder" */
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();
}
/** "ConcreteBuilder" */
class HawaiianPizzaBuilder extends PizzaBuilder {
public void buildDough() {
pizza.setDough("cross");
}
public void buildSauce() {
pizza.setSauce("mild");
}
public void buildTopping() {
pizza.setTopping("ham+pineapple");
}
}
/** "ConcreteBuilder" */
class SpicyPizzaBuilder extends PizzaBuilder {
public void buildDough() {
pizza.setDough("pan baked");
}
public void buildSauce() {
pizza.setSauce("hot");
}
public void buildTopping() {
pizza.setTopping("pepperoni+salami");
}
}
/** "Director" */
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();
}
}
/** A given type of pizza being constructed. */
public class BuilderExample {
public static void main(String[] args) {
Cook cook = new Cook();
PizzaBuilder hawaiianPizzaBuilder = new HawaiianPizzaBuilder();
PizzaBuilder spicyPizzaBuilder = new SpicyPizzaBuilder();
cook.setPizzaBuilder(hawaiianPizzaBuilder);
cook.constructPizza();
Pizza pizza = cook.getPizza();
}
}
C#
//Implementation in C#.
class Pizza
{
string dough;
string sauce;
string topping;
public Pizza() {}
public void SetDough( string d){ dough = d;}
public void SetSauce( string s){ sauce = s;}
public void SetTopping( string t){ topping = t;}
}
//Abstract Builder
abstract class PizzaBuilder
{
protected Pizza pizza;
public PizzaBuilder(){}
public Pizza GetPizza(){ return pizza; }
public void CreateNewPizza() { pizza = new Pizza(); }
public abstract void BuildDough();
public abstract void BuildSauce();
public abstract void BuildTopping();
}
//Concrete Builder
class HawaiianPizzaBuilder : PizzaBuilder
{
public override void BuildDough() { pizza.SetDough("cross"); }
public override void BuildSauce() { pizza.SetSauce("mild"); }
public override void BuildTopping() { pizza.SetTopping("ham+pineapple"); }
}
//Concrete Builder
class SpicyPizzaBuilder : PizzaBuilder
{
public override void BuildDough() { pizza.SetDough("pan baked"); }
public override void BuildSauce() { pizza.SetSauce("hot"); }
public override void BuildTopping() { pizza.SetTopping("pepparoni+salami"); }
}
/** "Director" */
class Waiter {
private PizzaBuilder pizzaBuilder;
public void SetPizzaBuilder (PizzaBuilder pb) { pizzaBuilder = pb; }
public Pizza GetPizza() { return pizzaBuilder.GetPizza(); }
public void ConstructPizza() {
pizzaBuilder.CreateNewPizza();
pizzaBuilder.BuildDough();
pizzaBuilder.BuildSauce();
pizzaBuilder.BuildTopping();
}
}
/** A customer ordering a pizza. */
class BuilderExample
{
public static void Main(String[] args) {
Waiter waiter = new Waiter();
PizzaBuilder hawaiianPizzaBuilder = new HawaiianPizzaBuilder();
PizzaBuilder spicyPizzaBuilder = new SpicyPizzaBuilder();
waiter.SetPizzaBuilder ( hawaiianPizzaBuilder );
waiter.ConstructPizza();
Pizza pizza = waiter.GetPizza();
}
}
C++Visual PrologProduct interface pizza
predicates
setDough : (string Dough).
setSauce : (string Sauce).
setTopping : (string Topping).
end interface pizza
class pizza : pizza
end class pizza
implement pizza
facts
dough : string := "".
sauce : string := "".
topping : string := "".
clauses
setDough(Dough) :- dough := Dough.
clauses
setSauce(Sauce) :- sauce := Sauce.
clauses
setTopping(Topping) :- topping := Topping.
end implement pizza
Abstract Builder interface pizzaBuilder
predicates
getPizza : () -> pizza Pizza.
createNewPizzaProduct : ().
predicates
buildDough : ().
buildSauce : ().
buildTopping : ().
end interface pizzaBuilder
Visual Prolog does not support abstract classes, but we can create a support class instead: interface pizzaBuilderSupport
predicates from pizzaBuilder
getPizza, createNewPizzaProduct
end interface pizzaBuilderSupport
class pizzaBuilderSupport : pizzaBuilderSupport
end class pizzaBuilderSupport
implement pizzaBuilderSupport
facts
pizza : pizza := erroneous.
clauses
getPizza() = pizza.
clauses
createNewPizzaProduct() :- pizza := pizza::new().
end implement pizzaBuilderSupport
ConcreteBuilder #1 class hawaiianPizzaBuilder : pizzaBuilder
end class hawaiianPizzaBuilder
implement hawaiianPizzaBuilder
inherits pizzaBuilderSupport
clauses
buildDough() :- getPizza():setDough("cross").
clauses
buildSauce() :- getPizza():setSauce("mild").
clauses
buildTopping() :- getPizza():setTopping("ham+pineapple").
end implement hawaiianPizzaBuilder
ConcreteBuilder #2 class spicyPizzaBuilder : pizzaBuilder
end class spicyPizzaBuilder
implement spicyPizzaBuilder
inherits pizzaBuilderSupport
clauses
buildDough() :- getPizza():setDough("pan baked").
clauses
buildSauce() :- getPizza():setSauce("hot").
clauses
buildTopping() :- getPizza():setTopping("pepperoni+salami").
end implement spicyPizzaBuilder
Director interface waiter
predicates
setPizzaBuilder : (pizzaBuilder PizzaBuilder).
getPizza : () -> pizza Pizza.
predicates
constructPizza : ().
end interface waiter
class waiter : waiter
end class waiter
implement waiter
facts
pizzaBuilder : pizzaBuilder := erroneous.
clauses
setPizzaBuilder(PizzaBuilder) :- pizzaBuilder := PizzaBuilder.
clauses
getPizza() = pizzaBuilder:getPizza().
clauses
constructPizza() :-
pizzaBuilder:createNewPizzaProduct(),
pizzaBuilder:buildDough(),
pizzaBuilder:buildSauce(),
pizzaBuilder:buildTopping().
end implement waiter
A customer ordering a pizza. goal Hawaiian_pizzabuilder = hawaiianPizzaBuilder::new(), Waiter = waiter::new(), Waiter:setPizzaBuilder(Hawaiian_pizzabuilder), Waiter:constructPizza(), Pizza = Waiter:getPizza(). perlPHP
/** Product **/
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);
External links
de:Builder (Entwurfsmuster) es:Builder (patrón de diseño) fr:Monteur (patron de conception) it:Builder ja:Builder ???? pl:Wzorzec budowniczego pt:Builder ru:????????? (?????? ??????????????) uk:???????? (?????? ????????????) zh:??? (????) Source: Wikipedia | The above article is available under the GNU FDL. | Edit this article
|
|
top
©2008-2009 TutorGig.com. All Rights Reserved. Privacy Statement