Builder pattern: Difference between revisions
Ssimsekler (talk | contribs) No edit summary |
Ssimsekler (talk | contribs) m Language examples are re-arranged w.r.t. alphabetical order |
||
Line 27: | Line 27: | ||
==Example== |
==Example== |
||
=== Java === |
|||
<source lang="java"> |
|||
/** "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(); |
|||
} |
|||
</source> |
|||
<source lang="java"> |
|||
/** "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"); |
|||
} |
|||
} |
|||
</source> |
|||
<source lang="java"> |
|||
/** "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 hawaiian = cook.getPizza(); |
|||
cook.setPizzaBuilder(spicyPizzaBuilder); |
|||
cook.constructPizza(); |
|||
Pizza spicy = cook.getPizza(); |
|||
} |
|||
} |
|||
</source> |
|||
=== C# === |
|||
<source lang="csharp"> |
|||
/** "Product" */ |
|||
class Pizza |
|||
{ |
|||
public string Dough { get; set; } |
|||
public string Sauce { get; set; } |
|||
public string Topping { get; set; } |
|||
} |
|||
/** "Abstract Builder" */ |
|||
abstract class PizzaBuilder |
|||
{ |
|||
public Pizza pizza { get; protected set; } |
|||
public void CreatePizza() |
|||
{ |
|||
pizza = new Pizza(); |
|||
} |
|||
public abstract void BuildDough(); |
|||
public abstract void BuildSauce(); |
|||
public abstract void BuildTopping(); |
|||
} |
|||
/** "ConcreteBuilder" */ |
|||
class HawaiianPizzaBuilder : PizzaBuilder |
|||
{ |
|||
public override void BuildDough() |
|||
{ |
|||
pizza.Dough = "Cross"; |
|||
} |
|||
public override void BuildSauce() |
|||
{ |
|||
pizza.Sauce = "Mild"; |
|||
} |
|||
public override void BuildTopping() |
|||
{ |
|||
pizza.Topping = "Ham+Pineapple"; |
|||
} |
|||
} |
|||
/** "ConcreteBuilder" */ |
|||
class SpicyPizzaBuilder : PizzaBuilder |
|||
{ |
|||
public override void BuildDough() |
|||
{ |
|||
pizza.Dough = "Pan Baked"; |
|||
} |
|||
public override void BuildSauce() |
|||
{ |
|||
pizza.Sauce = "Hot"; |
|||
} |
|||
public override void BuildTopping() |
|||
{ |
|||
pizza.Topping = "Pepperoni+Salami"; |
|||
} |
|||
} |
|||
/** "Director" */ |
|||
class Cook |
|||
{ |
|||
public PizzaBuilder PizzaBuilder { get; set; } |
|||
public Pizza Pizza { get { return PizzaBuilder.pizza; } } |
|||
public void MakePizza() |
|||
{ |
|||
PizzaBuilder.CreatePizza(); |
|||
PizzaBuilder.BuildDough(); |
|||
PizzaBuilder.BuildSauce(); |
|||
PizzaBuilder.BuildTopping(); |
|||
} |
|||
} |
|||
/** A given type of pizza being constructed. */ |
|||
static void Main(string[] args) |
|||
{ |
|||
Cook cook = new Cook(); |
|||
cook.PizzaBuilder = new SpicyPizzaBuilder(); |
|||
cook.MakePizza(); |
|||
cook.PizzaBuilder = new HawaiianPizzaBuilder(); |
|||
cook.MakePizza(); |
|||
} |
|||
</source> |
|||
=== Python === |
|||
<source lang="python"> |
|||
# Product |
|||
class Pizza: |
|||
def __init__(self): |
|||
self.dough = None |
|||
self.sauce = None |
|||
self.topping = None |
|||
# Abstract Builder |
|||
class PizzaBuilder: |
|||
def __init__(self): |
|||
self.pizza = None |
|||
def create_new_pizza_product(self): |
|||
self.pizza = Pizza() |
|||
# ConcreteBuilder |
|||
class HawaiianPizzaBuilder(PizzaBuilder): |
|||
def build_dough(self): |
|||
self.pizza.dough = "cross" |
|||
def build_sauce(self): |
|||
self.pizza.sauce = "mild" |
|||
def build_topping(self): |
|||
self.pizza.topping = "ham+pineapple" |
|||
# Director |
|||
class Cook: |
|||
def __init__(self): |
|||
self.pizza_builder = None |
|||
@property |
|||
def pizza(self): |
|||
return self.pizza_builder.pizza |
|||
def construct_pizza(self): |
|||
self.pizza_builder.create_new_pizza_product() |
|||
self.pizza_builder.build_dough() |
|||
self.pizza_builder.build_sauce() |
|||
self.pizza_builder.build_topping() |
|||
# A given type of pizza being constructed. |
|||
if __name__ == '__main__': |
|||
cook = Cook() |
|||
cook.pizza_builder = HawaiianPizzaBuilder() |
|||
cook.construct_pizza() |
|||
pizza = cook.pizza |
|||
</source> |
|||
=== ABAP === |
=== ABAP === |
||
Line 549: | Line 292: | ||
</source> |
</source> |
||
=== C# === |
|||
<source lang="csharp"> |
|||
/** "Product" */ |
|||
class Pizza |
|||
{ |
|||
public string Dough { get; set; } |
|||
public string Sauce { get; set; } |
|||
public string Topping { get; set; } |
|||
} |
|||
/** "Abstract Builder" */ |
|||
abstract class PizzaBuilder |
|||
{ |
|||
public Pizza pizza { get; protected set; } |
|||
public void CreatePizza() |
|||
{ |
|||
pizza = new Pizza(); |
|||
} |
|||
public abstract void BuildDough(); |
|||
public abstract void BuildSauce(); |
|||
public abstract void BuildTopping(); |
|||
} |
|||
/** "ConcreteBuilder" */ |
|||
class HawaiianPizzaBuilder : PizzaBuilder |
|||
{ |
|||
public override void BuildDough() |
|||
{ |
|||
pizza.Dough = "Cross"; |
|||
} |
|||
public override void BuildSauce() |
|||
{ |
|||
pizza.Sauce = "Mild"; |
|||
} |
|||
public override void BuildTopping() |
|||
{ |
|||
pizza.Topping = "Ham+Pineapple"; |
|||
} |
|||
} |
|||
/** "ConcreteBuilder" */ |
|||
class SpicyPizzaBuilder : PizzaBuilder |
|||
{ |
|||
public override void BuildDough() |
|||
{ |
|||
pizza.Dough = "Pan Baked"; |
|||
} |
|||
public override void BuildSauce() |
|||
{ |
|||
pizza.Sauce = "Hot"; |
|||
} |
|||
public override void BuildTopping() |
|||
{ |
|||
pizza.Topping = "Pepperoni+Salami"; |
|||
} |
|||
} |
|||
/** "Director" */ |
|||
class Cook |
|||
{ |
|||
public PizzaBuilder PizzaBuilder { get; set; } |
|||
public Pizza Pizza { get { return PizzaBuilder.pizza; } } |
|||
public void MakePizza() |
|||
{ |
|||
PizzaBuilder.CreatePizza(); |
|||
PizzaBuilder.BuildDough(); |
|||
PizzaBuilder.BuildSauce(); |
|||
PizzaBuilder.BuildTopping(); |
|||
} |
|||
} |
|||
/** A given type of pizza being constructed. */ |
|||
static void Main(string[] args) |
|||
{ |
|||
Cook cook = new Cook(); |
|||
cook.PizzaBuilder = new SpicyPizzaBuilder(); |
|||
cook.MakePizza(); |
|||
cook.PizzaBuilder = new HawaiianPizzaBuilder(); |
|||
cook.MakePizza(); |
|||
} |
|||
</source> |
|||
=== Java === |
|||
<source lang="java"> |
|||
/** "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(); |
|||
} |
|||
</source> |
|||
<source lang="java"> |
|||
/** "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"); |
|||
} |
|||
} |
|||
</source> |
|||
<source lang="java"> |
|||
/** "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 hawaiian = cook.getPizza(); |
|||
cook.setPizzaBuilder(spicyPizzaBuilder); |
|||
cook.constructPizza(); |
|||
Pizza spicy = cook.getPizza(); |
|||
} |
|||
} |
|||
</source> |
|||
=== Python === |
|||
<source lang="python"> |
|||
# Product |
|||
class Pizza: |
|||
def __init__(self): |
|||
self.dough = None |
|||
self.sauce = None |
|||
self.topping = None |
|||
# Abstract Builder |
|||
class PizzaBuilder: |
|||
def __init__(self): |
|||
self.pizza = None |
|||
def create_new_pizza_product(self): |
|||
self.pizza = Pizza() |
|||
# ConcreteBuilder |
|||
class HawaiianPizzaBuilder(PizzaBuilder): |
|||
def build_dough(self): |
|||
self.pizza.dough = "cross" |
|||
def build_sauce(self): |
|||
self.pizza.sauce = "mild" |
|||
def build_topping(self): |
|||
self.pizza.topping = "ham+pineapple" |
|||
# Director |
|||
class Cook: |
|||
def __init__(self): |
|||
self.pizza_builder = None |
|||
@property |
|||
def pizza(self): |
|||
return self.pizza_builder.pizza |
|||
def construct_pizza(self): |
|||
self.pizza_builder.create_new_pizza_product() |
|||
self.pizza_builder.build_dough() |
|||
self.pizza_builder.build_sauce() |
|||
self.pizza_builder.build_topping() |
|||
# A given type of pizza being constructed. |
|||
if __name__ == '__main__': |
|||
cook = Cook() |
|||
cook.pizza_builder = HawaiianPizzaBuilder() |
|||
cook.construct_pizza() |
|||
pizza = cook.pizza |
|||
</source> |
|||
==External links== |
==External links== |
Revision as of 11:38, 14 May 2010
The Builder Pattern is a software design pattern. The intention is to abstract steps of construction of objects so that different implementations of these steps can construct different representations of objects.
Often, the Builder Pattern is used to build Products in accordance to the Composite pattern, a structure pattern.
Class Diagram
Builder
Abstract interface for creating objects (product).
Concrete Builder
Provide implementation for Builder. It is an object able to construct other objects. Construct and assemble parts to build the objects.
Director
The 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.
Product
The final object that will be created by the Director using Builder..
Useful tips
- Builder focuses on constructing a complex object step by step. Abstract Factory emphasizes a family of product objects (either simple or complex). Builder returns the product as a final step, but as far as the Abstract Factory is concerned, the product gets returned immediately.
- Builder often builds a Composite.
- Often, designs start out using Factory Method (less complicated, more customizable, subclasses proliferate) and evolve toward Abstract Factory, Prototype, or Builder (more flexible, more complex) as the designer discovers where more flexibility is needed.
- Sometimes creational patterns are complementary: Builder can use one of the other patterns to implement which components are built. Abstract Factory, Builder, and Prototype can use Singleton in their implementations.
Example
ABAP
REPORT zz_pizza_builder_pattern_test NO STANDARD PAGE HEADING .
* Types
TYPES ty_pizza_type TYPE i .
TYPES ty_dough TYPE string .
TYPES ty_sauce TYPE string .
TYPES ty_topping TYPE string .
*----------------------------------------------------------------------*
* CLASS lcl_pizza DEFINITION - PRODUCT
*----------------------------------------------------------------------*
CLASS lcl_pizza DEFINITION .
PUBLIC SECTION .
METHODS set_name IMPORTING x_name TYPE string .
METHODS set_dough IMPORTING x_dough TYPE ty_dough .
METHODS set_sauce IMPORTING x_sauce TYPE ty_sauce .
METHODS set_topping IMPORTING x_topping TYPE ty_topping .
METHODS write_definition .
PRIVATE SECTION .
DATA p_pizza_name TYPE string .
DATA p_dough TYPE ty_dough .
DATA p_sauce TYPE ty_sauce .
DATA p_topping TYPE ty_topping .
ENDCLASS . "lcl_pizza DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_pizza_builder DEFINITION - ABSTRACT BUILDER
*----------------------------------------------------------------------*
CLASS lcl_pizza_builder DEFINITION ABSTRACT .
PUBLIC SECTION .
METHODS create_new_pizza_product .
METHODS get_pizza RETURNING value(yo_pizza) TYPE REF TO lcl_pizza .
METHODS set_name ABSTRACT .
METHODS build_dough ABSTRACT .
METHODS build_sauce ABSTRACT .
METHODS build_topping ABSTRACT .
PROTECTED SECTION .
DATA po_pizza TYPE REF TO lcl_pizza .
ENDCLASS . "lcl_pizza_builder DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_hawaiian_pizza_builder DEFINITION - CONCRETE BUILDER
*----------------------------------------------------------------------*
CLASS lcl_hawaiian_pizza_builder DEFINITION INHERITING FROM lcl_pizza_builder .
PUBLIC SECTION .
METHODS set_name REDEFINITION .
METHODS build_dough REDEFINITION .
METHODS build_sauce REDEFINITION .
METHODS build_topping REDEFINITION .
ENDCLASS . "lcl_hawaiian_pizza_builder DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_spicy_pizza_builder DEFINITION - CONCRETE BUILDER
*----------------------------------------------------------------------*
CLASS lcl_spicy_pizza_builder DEFINITION INHERITING FROM lcl_pizza_builder .
PUBLIC SECTION .
METHODS set_name REDEFINITION .
METHODS build_dough REDEFINITION .
METHODS build_sauce REDEFINITION .
METHODS build_topping REDEFINITION .
ENDCLASS . "lcl_spicy_pizza_builder DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_cook DEFINITION - DIRECTOR
*----------------------------------------------------------------------*
CLASS lcl_cook DEFINITION .
PUBLIC SECTION .
METHODS set_pizza_builder IMPORTING xo_pb TYPE REF TO lcl_pizza_builder .
METHODS get_pizza RETURNING value(yo_pizza) TYPE REF TO lcl_pizza .
METHODS construct_pizza .
PRIVATE SECTION .
DATA po_pizza_builder TYPE REF TO lcl_pizza_builder .
ENDCLASS . "lcl_cook DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_pizza IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_pizza IMPLEMENTATION .
METHOD set_name .
p_pizza_name = x_name .
ENDMETHOD . "set_name
METHOD set_dough .
p_dough = x_dough .
ENDMETHOD . "set_dough
METHOD set_sauce .
p_sauce = x_sauce .
ENDMETHOD . "set_sauce
METHOD set_topping .
p_topping = x_topping .
ENDMETHOD . "set_topping
METHOD write_definition .
WRITE:/(30) p_pizza_name COLOR COL_GROUP ,
(10) 'Dough:'(001) COLOR COL_HEADING , (20) p_dough,
(10) 'Sauce:'(002) COLOR COL_HEADING , (20) p_sauce,
(10) 'Topping:'(003) COLOR COL_HEADING , (20) p_topping .
ENDMETHOD . "get_definition
ENDCLASS . "lcl_pizza IMPLEMENTATION
*----------------------------------------------------------------------*
* CLASS lcl_pizza_builder IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_pizza_builder IMPLEMENTATION .
METHOD get_pizza .
yo_pizza = po_pizza .
ENDMETHOD . "get_pizza
METHOD create_new_pizza_product .
CREATE OBJECT po_pizza TYPE lcl_pizza .
ENDMETHOD . "create_new_pizza_product
ENDCLASS . "lcl_pizza_builder IMPLEMENTATION
*----------------------------------------------------------------------*
* CLASS lcl_hawaiian_pizza_builder IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_hawaiian_pizza_builder IMPLEMENTATION .
METHOD set_name .
po_pizza->set_name('Hawaiian Pizza') .
ENDMETHOD . "set_name
METHOD build_dough .
po_pizza->set_dough('Cross') .
ENDMETHOD . "build_dough
METHOD build_sauce .
po_pizza->set_sauce('Mild') .
ENDMETHOD . "build_sauce
METHOD build_topping .
po_pizza->set_topping('Ham & pineapple') .
ENDMETHOD . "build_topping
ENDCLASS . "lcl_hawaiian_pizza_builder IMPLEMENTATION
*----------------------------------------------------------------------*
* CLASS lcl_spicy_pizza_builder IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_spicy_pizza_builder IMPLEMENTATION .
METHOD set_name .
po_pizza->set_name('Spicy Pizza') .
ENDMETHOD . "set_name
METHOD build_dough .
po_pizza->set_dough('Pan baked') .
ENDMETHOD . "build_dough
METHOD build_sauce .
po_pizza->set_sauce('Hot') .
ENDMETHOD . "build_sauce
METHOD build_topping .
po_pizza->set_topping('Pepperoni & salami') .
ENDMETHOD . "build_topping
ENDCLASS . "lcl_spicy_pizza_builder IMPLEMENTATION
*----------------------------------------------------------------------*
* CLASS lcl_cook IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_cook IMPLEMENTATION .
METHOD set_pizza_builder .
po_pizza_builder = xo_pb .
ENDMETHOD . "set_pizza_builder
METHOD get_pizza .
yo_pizza = po_pizza_builder->get_pizza( ) .
ENDMETHOD . "get_pizza
METHOD construct_pizza .
po_pizza_builder->create_new_pizza_product( ) .
po_pizza_builder->set_name( ) .
po_pizza_builder->build_dough( ) .
po_pizza_builder->build_sauce( ) .
po_pizza_builder->build_topping( ) .
ENDMETHOD . "construct_pizza
ENDCLASS . "lcl_cook IMPLEMENTATION
START-OF-SELECTION .
DATA go_cook TYPE REF TO lcl_cook .
DATA go_hawaiian_pb TYPE REF TO lcl_hawaiian_pizza_builder .
DATA go_spicy_pb TYPE REF TO lcl_spicy_pizza_builder .
DATA go_hawaiian_pizza TYPE REF TO lcl_pizza .
DATA go_spicy_pizza TYPE REF TO lcl_pizza .
CREATE OBJECT go_cook .
CREATE OBJECT go_hawaiian_pb .
CREATE OBJECT go_spicy_pb .
go_cook->set_pizza_builder( go_hawaiian_pb ) .
go_cook->construct_pizza( ) .
go_hawaiian_pizza = go_cook->get_pizza( ) .
go_hawaiian_pizza->write_definition( ) .
go_cook->set_pizza_builder( go_spicy_pb ) .
go_cook->construct_pizza( ) .
go_spicy_pizza = go_cook->get_pizza( ) .
go_spicy_pizza->write_definition( ) .
*Output
*Hawaiian Pizza Dough: Cross Sauce: Mild Topping: Ham & pineapple
*Spicy Pizza Dough: Pan baked Sauce: Hot Topping: Pepperoni & salami
C#
/** "Product" */
class Pizza
{
public string Dough { get; set; }
public string Sauce { get; set; }
public string Topping { get; set; }
}
/** "Abstract Builder" */
abstract class PizzaBuilder
{
public Pizza pizza { get; protected set; }
public void CreatePizza()
{
pizza = new Pizza();
}
public abstract void BuildDough();
public abstract void BuildSauce();
public abstract void BuildTopping();
}
/** "ConcreteBuilder" */
class HawaiianPizzaBuilder : PizzaBuilder
{
public override void BuildDough()
{
pizza.Dough = "Cross";
}
public override void BuildSauce()
{
pizza.Sauce = "Mild";
}
public override void BuildTopping()
{
pizza.Topping = "Ham+Pineapple";
}
}
/** "ConcreteBuilder" */
class SpicyPizzaBuilder : PizzaBuilder
{
public override void BuildDough()
{
pizza.Dough = "Pan Baked";
}
public override void BuildSauce()
{
pizza.Sauce = "Hot";
}
public override void BuildTopping()
{
pizza.Topping = "Pepperoni+Salami";
}
}
/** "Director" */
class Cook
{
public PizzaBuilder PizzaBuilder { get; set; }
public Pizza Pizza { get { return PizzaBuilder.pizza; } }
public void MakePizza()
{
PizzaBuilder.CreatePizza();
PizzaBuilder.BuildDough();
PizzaBuilder.BuildSauce();
PizzaBuilder.BuildTopping();
}
}
/** A given type of pizza being constructed. */
static void Main(string[] args)
{
Cook cook = new Cook();
cook.PizzaBuilder = new SpicyPizzaBuilder();
cook.MakePizza();
cook.PizzaBuilder = new HawaiianPizzaBuilder();
cook.MakePizza();
}
Java
/** "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 hawaiian = cook.getPizza();
cook.setPizzaBuilder(spicyPizzaBuilder);
cook.constructPizza();
Pizza spicy = cook.getPizza();
}
}
Python
# Product
class Pizza:
def __init__(self):
self.dough = None
self.sauce = None
self.topping = None
# Abstract Builder
class PizzaBuilder:
def __init__(self):
self.pizza = None
def create_new_pizza_product(self):
self.pizza = Pizza()
# ConcreteBuilder
class HawaiianPizzaBuilder(PizzaBuilder):
def build_dough(self):
self.pizza.dough = "cross"
def build_sauce(self):
self.pizza.sauce = "mild"
def build_topping(self):
self.pizza.topping = "ham+pineapple"
# Director
class Cook:
def __init__(self):
self.pizza_builder = None
@property
def pizza(self):
return self.pizza_builder.pizza
def construct_pizza(self):
self.pizza_builder.create_new_pizza_product()
self.pizza_builder.build_dough()
self.pizza_builder.build_sauce()
self.pizza_builder.build_topping()
# A given type of pizza being constructed.
if __name__ == '__main__':
cook = Cook()
cook.pizza_builder = HawaiianPizzaBuilder()
cook.construct_pizza()
pizza = cook.pizza
External links
- What is the difference between Factory pattern and Builder Pattern ?
- The JavaWorld article Build user interfaces without getters and setters (Allen Holub) shows the complete Java source code for a Builder.
- Item 2: Consider a builder by Joshua Bloch