Builder Pattern
Author: Deron Eriksson
Description: This Java tutorial describes the builder pattern, a creational design pattern.
Tutorial created using:
Windows Vista || JDK 1.6.0_11 || Eclipse JEE Ganymede SR1 (Eclipse 3.4.1)
The builder pattern is a creational design pattern used to assemble complex objects. With the builder pattern, the same object construction process can be used to create different objects. The builder has 4 main parts: a Builder, Concrete Builders, a Director, and a Product. A Builder is an interface (or abstract class) that is implemented (or extended) by Concrete Builders. The Builder interface sets forth the actions (methods) involved in assembling a Product object. It also has a method for retrieving the Product object (ie, getProduct()). The Product object is the object that gets assembled in the builder pattern. Concrete Builders implement the Builder interface (or extend the Builder abstract class). A Concrete Builder is responsible for creating and assembling a Product object. Different Concrete Builders create and assemble Product objects differently. A Director object is responsible for constructing a Product. It does this via the Builder interface to a Concrete Builder. It constructs a Product via the various Builder methods. There are various uses of the builder pattern. For one, if we'd like the construction process to remain the same but we'd like to create a different type of Product, we can create a new Concrete Builder and pass this to the same Director. If we'd like to alter the construction process, we can modify the Director to use a different construction process. Now, let's look at an example of the builder pattern. Our example will build different kinds of restaurant meals. First off, our Product will be a Meal class, which represents food items in a meal. It represents a drink, main course, and side item. Meal.javapackage com.cakes; public class Meal { private String drink; private String mainCourse; private String side; public String getDrink() { return drink; } public void setDrink(String drink) { this.drink = drink; } public String getMainCourse() { return mainCourse; } public void setMainCourse(String mainCourse) { this.mainCourse = mainCourse; } public String getSide() { return side; } public void setSide(String side) { this.side = side; } public String toString() { return "drink:" + drink + ", main course:" + mainCourse + ", side:" + side; } } Our Builder interface is MealBuilder. It features methods used to build a meal and a method to retrieve the meal. MealBuilder.javapackage com.cakes; public interface MealBuilder { public void buildDrink(); public void buildMainCourse(); public void buildSide(); public Meal getMeal(); } Our first Concrete Builder is ItalianMealBuilder. Its constructor creates a meal. Its methods are implemented to build the various parts of the meal. It returns the meal via getMeal(). ItalianMealBuilder.javapackage com.cakes; public class ItalianMealBuilder implements MealBuilder { private Meal meal; public ItalianMealBuilder() { meal = new Meal(); } @Override public void buildDrink() { meal.setDrink("red wine"); } @Override public void buildMainCourse() { meal.setMainCourse("pizza"); } @Override public void buildSide() { meal.setSide("bread"); } @Override public Meal getMeal() { return meal; } } Our second Concrete Builder is JapaneseMealBuilder. Its constructor creates a meal. Its methods are implemented to build the various parts of a Japanese meal. It returns the meal via getMeal(). JapaneseMealBuilder.javapackage com.cakes; public class JapaneseMealBuilder implements MealBuilder { private Meal meal; public JapaneseMealBuilder() { meal = new Meal(); } @Override public void buildDrink() { meal.setDrink("sake"); } @Override public void buildMainCourse() { meal.setMainCourse("chicken teriyaki"); } @Override public void buildSide() { meal.setSide("miso soup"); } @Override public Meal getMeal() { return meal; } } (Continued on page 2) Related Tutorials:
|