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(); } }