Java Tutorial/Design Pattern/Builder Pattern
Builder pattern: build a house
<source lang="java">
import java.util.LinkedList; import java.util.List; public class BuilderDemo {
public static void main(String[] args) { HouseBuilder builder = new SimpleHouseBuilder(); HouseBuildingCompany houseBuildingCompany = new HouseBuildingCompany(); House house = houseBuildingCompany.build(builder); System.out.println(house); }
} interface HouseBuilder {
void buildBasement(); void buildWalls(); void buildRoof(); House getHouse();
} class HouseBuildingCompany {
public House build(HouseBuilder builder) { builder.buildBasement(); builder.buildWalls(); builder.buildRoof(); return builder.getHouse(); }
} class SimpleHouseBuilder implements HouseBuilder {
private House house; public SimpleHouseBuilder() { this.house = new House(); } public void buildBasement() { this.house.setBasement(new Basement()); } public void buildWalls() { for (int i = 0; i < 4; i++) this.house.addWall(new Wall()); } public void buildRoof() { this.house.setRoot(new Roof()); } public House getHouse() { return this.house; }
} class Basement {
@Override public String toString() { return "Basement"; }
} class Wall {
@Override public String toString() { return "Wall"; }
} class Roof {
@Override public String toString() { return "Roof"; }
} class House {
private Basement basement; private List<Wall> walls; private Roof roof; public House() { this.walls = new LinkedList<Wall>(); } public void addWall(Wall wall) { this.walls.add(wall); } public void setRoot(Roof roof) { this.roof = roof; } public void setBasement(Basement basement) { this.basement = basement; } @Override public String toString() { return "House {" + this.basement + ", " + this.walls + ", " + this.roof + "}"; }
}</source>
Builder pattern with interface
<source lang="java">
import java.util.ArrayList; import java.util.Iterator; public class TestRobotBuilder {
public static void main(String args[]) { Machine builder; RobotBuildable robot; String response = "a"; builder = new Cooker(); // builder = new AutomotiveRobotBuilder(); // Start the construction process. builder.addStart(); builder.addTest(); builder.addAssemble(); builder.addStop(); robot = builder.getRobot(); robot.go(); }
} interface Machine {
public void addStart(); public void addGetParts(); public void addAssemble(); public void addTest(); public void addStop(); public RobotBuildable getRobot();
} interface RobotBuildable {
public void go();
} class Cooker implements Machine {
CookerBuildable robot; ArrayList<Integer> actions; public Cooker() { robot = new CookerBuildable(); actions = new ArrayList<Integer>(); } public void addStart() { actions.add(new Integer(1)); } public void addGetParts() { actions.add(new Integer(2)); } public void addAssemble() { actions.add(new Integer(3)); } public void addTest() { actions.add(new Integer(4)); } public void addStop() { actions.add(new Integer(5)); } public RobotBuildable getRobot() { robot.loadActions(actions); return robot; }
} class Car implements Machine {
CarBuildable robot; ArrayList<Integer> actions; public Car() { robot = new CarBuildable(); actions = new ArrayList<Integer>(); } public void addStart() { actions.add(new Integer(1)); } public void addGetParts() { actions.add(new Integer(2)); } public void addAssemble() { actions.add(new Integer(3)); } public void addTest() { actions.add(new Integer(4)); } public void addStop() { actions.add(new Integer(5)); } public RobotBuildable getRobot() { robot.loadActions(actions); return robot; }
} class CookerBuildable implements RobotBuildable {
ArrayList<Integer> actions; public CookerBuildable() { } public final void go() { Iterator itr = actions.iterator(); while (itr.hasNext()) { switch ((Integer) itr.next()) { case 1: start(); break; case 2: getParts(); break; case 3: assemble(); break; case 4: test(); break; case 5: stop(); break; } } } public void start() { System.out.println("Starting...."); } public void getParts() { System.out.println("Getting flour and sugar...."); } public void assemble() { System.out.println("Baking a cookie...."); } public void test() { System.out.println("Crunching a cookie...."); } public void stop() { System.out.println("Stopping...."); } public void loadActions(ArrayList<Integer> a) { actions = a; }
} class CarBuildable implements RobotBuildable {
ArrayList<Integer> actions; public CarBuildable() { } public final void go() { Iterator itr = actions.iterator(); while (itr.hasNext()) { switch ((Integer) itr.next()) { case 1: start(); break; case 2: getParts(); break; case 3: assemble(); break; case 4: test(); break; case 5: stop(); break; } } } public void start() { System.out.println("Starting...."); } public void getParts() { System.out.println("Getting a carburetor...."); } public void assemble() { System.out.println("Installing the carburetor...."); } public void test() { System.out.println("Revving the engine...."); } public void stop() { System.out.println("Stopping...."); } public void loadActions(ArrayList<Integer> a) { actions = a; }
}</source>
Example of the Builder pattern
<source lang="java">
import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; class Office extends ArrayList<OfficeUnit> { } class Word extends Office { } class PPT extends Office { } class Excel extends Office { } class OfficeUnit {
private String s; public OfficeUnit(String s) { this.s = s; } public String toString() { return s; }
} class DocumentPage extends OfficeUnit {
public DocumentPage(String s) { super(s); }
} class PPTSlide extends OfficeUnit {
public PPTSlide(String s) { super(s); }
} class ExcelWorkbook extends OfficeUnit {
public ExcelWorkbook(String s) { super(s); }
} class OfficeBuilder {
public void buildBase() { } public void addOfficeUnit(OfficeUnit item) { } public Office getFinishedMedia() { return null; }
} class WordBuilder extends OfficeBuilder {
private Word b; public void buildBase() { System.out.println("Building word framework"); b = new Word(); } public void addOfficeUnit(OfficeUnit chapter) { System.out.println("Adding word page " + chapter); b.add(chapter); } public Office getFinishedMedia() { return b; }
} class PPTBuilder extends OfficeBuilder {
private PPT m; public void buildBase() { System.out.println("Building PPT"); m = new PPT(); } public void addOfficeUnit(OfficeUnit article) { System.out.println("Adding slide" + article); m.add(article); } public Office getFinishedMedia() { return m; }
} class ExcelBuilder extends OfficeBuilder {
private Excel w; public void buildBase() { System.out.println("Building Excel"); w = new Excel(); } public void addOfficeUnit(OfficeUnit webItem) { System.out.println("Adding workbook" + webItem); w.add(webItem); } public Office getFinishedMedia() { return w; }
} class OfficeDirector {
private OfficeBuilder mb; public OfficeDirector(OfficeBuilder mb) { this.mb = mb; } public Office produceMedia(List input) { mb.buildBase(); for (Iterator it = input.iterator(); it.hasNext();) mb.addOfficeUnit((OfficeUnit) it.next()); return mb.getFinishedMedia(); }
}; public class BuildOfficeDemo {
public static void main(String[] args) { List input = Arrays.asList(new OfficeUnit[] { new OfficeUnit("item1"), new OfficeUnit("item2"), new OfficeUnit("item3"), new OfficeUnit("item4"), }); OfficeDirector buildBook = new OfficeDirector(new WordBuilder()); Office word = buildBook.produceMedia(input); String result = "word: " + word; System.out.println(result); OfficeDirector buildMagazine = new OfficeDirector(new PPTBuilder()); Office ppt = buildMagazine.produceMedia(input); result = "PPT: " + ppt; System.out.println(result); OfficeDirector buildWebSite = new OfficeDirector(new ExcelBuilder()); Office excel = buildWebSite.produceMedia(input); result = "Excel: " + excel; System.out.println(result); }
}</source>