Jump to content

Builder pattern: Difference between revisions

From Wikipedia, the free encyclopedia
Content deleted Content added
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 Structure

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