csdreamer.com

Builder

Definition


Separate the construction of a complex object from its representation so that the same construction process can create different representations.

UML class diagram


Participants


  • Builder
    • specifies an abstract interface for creating parts of a Product object
  • ConcreteBuilder
    • constructs and assembles parts of the product by implementing the Builder interface
    • defines and keeps track of the representation it creates
    • provides an interface for retrieving the product
  • Director
    • constructs an object using the Builder interface
  • Product
    • represents the complex object under construction. ConcreteBuilder builds the product's internal representation and defines the process by which it's assembled
    • includes classes that define the constituent parts, including interfaces for assembling the parts into the final result

Sample code in Java

package com.hong.builder;

import java.util.ArrayList;
import java.util.List;

class Product
{
    private List<String> parts =new ArrayList<String>(); 
    
    public void addPart(String part)
    {
        parts.add(part);
    }
    public void showParts()
    {
        System.out.println("Product contains: ");
        for(String part : parts)
        {
            System.out.println(part);
        }
    }
}

interface Builder
{
    public void buildPartA();
    public void buildPartB();
    public Product getProduct();
}

class ConcreteBuilderA implements Builder
{

    private Product product; 
    
    public ConcreteBuilderA() { product = new Product();}
    
    @Override
    public void buildPartA() {
        product.addPart("Part A");
    }

    @Override
    public void buildPartB() {
        product.addPart("Part B");
    }

    @Override
    public Product getProduct() {
        return product;
    }
}

class ConcreteBuilderB implements Builder
{

    private Product product; 
    
    public ConcreteBuilderB() { product = new Product();}
    
    @Override
    public void buildPartA() {
        product.addPart("Part C");
    }

    @Override
    public void buildPartB() {
        product.addPart("Part D");
    }

    @Override
    public Product getProduct() {
        return product;
    }
}

class Director
{
    public void construct(Builder builder)
    {
        builder.buildPartA();
        builder.buildPartB();
    }
}
public class Builder_structure {
    
    public static void main(String[] args)
    {
        Director director = new Director();
        
        Builder builderA = new ConcreteBuilderA();
        Builder builderB = new ConcreteBuilderB(); 
        
        
        director.construct(builderA); 
        Product productA = builderA.getProduct(); 
        
        
        director.construct(builderB); 
        Product productB = builderB.getProduct();
        
        productA.showParts();
        productB.showParts();
    }
}