The joy of the Builder Pattern (A Java example)

I was recently introduced to the beauty of the Builder Pattern, a true ‘medicament’ to reduce the number of parameters required for a constructor. The Builder pattern enables the construction of complex objects by splitting the individual steps into separate methods of a Builder hierarchy in which a Director object controls the order of execution.

Here is an example of the Builder Pattern for the object Cat in which the Builder object is a nested class inside the Cat Class. An enhanced version of the builder can take into account the use of Custom Types (for example type Breed), which in turns are employed as parameter objects with their own builders.

public class Cat
{
    private final String breed;
    private final String name;
    private final int age;
    private final double weight;
    private final String furColour;
    private final boolean isFemale;
    private final boolean isMale;
    private final boolean isDeclawed;
    private final boolean isSpayed;
    private final boolean isNeutered;
    private final boolean isStray;
    private final boolean isMicrochipped;
    private Cat(
    final String newBreed,
    final String newName,
    final int newAge,
    final double newWeight,
    final String newFurColour,
    final boolean newIsFemale,
    final boolean newIsMale,
    final boolean newIsDeclawed,
    final boolean newIsSpayed,
    final boolean newIsNeutered,
    final boolean newIsStray,
    final boolean newIsMicrochipped)
    {
        this.breed = newBreed;
        this.name = newName;
        this.age = newAge;
        this.weight = newWeight;
        this.furColour = newFurColour;
        this.isFemale = newIsFemale;
        this.isMale = newIsMale;
        this.isDeclawed = newIsDeclawed;
        this.isSpayed = newIsSpayed;
        this.isNeutered = newIsNeutered;
        this.isStray = newIsStray;
        this.isMicrochipped = newIsMicrochipped;
    }

    public static class CatBuilder
    {
        private String nestedBreed;
        private String nestedName;
        private int nestedAge;
        private double nestedWeight;
        private String nestedFurColour;
        private boolean nestedIsFemale;
        private boolean nestedIsMale;
        private boolean nestedIsDeclawed;
        private boolean nestedIsSpayed;
        private boolean nestedIsNeutered;
        private boolean nestedIsStray;
        private boolean nestedIsMicrochipped;
        public CatBuilder(
        final String newName,
        final String newBreed,
        final int newAge)
        {
            this.nestedName = newName;
            this.nestedBreed = newBreed;
            this.nestedAge = newAge;
        }

        public CatBuilder withBreed(String newBreed)
        {
            this.nestedBreed = newBreed;
            return this;
        }

        public CatBuilder withName(String newName)
        {
            this.nestedName = newName;
            return this;
        }

        public CatBuilder withAge(int newAge)
        {
            this.nestedAge = newAge;
            return this;
        }

        public CatBuilder withWeight(double newWeight)
        {
            this.nestedWeight = newWeight;
            return this;
        }

        public CatBuilder withFurColour(String newFurColour)
        {
            this.nestedFurColour = newFurColour;
            return this;
        }

        public CatBuilder isFemale(boolean newIsFemale)
        {
            this.nestedIsFemale = newIsFemale;
            return this;
        }

        public CatBuilder isMale(boolean newIsMale)
        {
            this.nestedIsMale = newIsMale;
            return this;
        }

        public CatBuilder isDeclawed(boolean newIsDeclawed)
        {
            this.nestedIsDeclawed = newIsDeclawed;
            return this;
        }

        public CatBuilder isSpayed(boolean newIsSpayed)
        {
            this.nestedIsSpayed = newIsSpayed;
            return this;
        }

        public CatBuilder isNeutered(boolean newIsNeutered)
        {
            this.nestedIsNeutered = newIsNeutered;
            return this;
        }

        public CatBuilder isStray(boolean newIsStray)
        {
            this.nestedIsStray = newIsStray;
            return this;
        }

        public CatBuilder isMicrochipped(boolean newIsMicrochipped)
        {
            this.nestedIsMicrochipped = newIsMicrochipped;
            return this;
        }

        public Cat createCat()
        {
            return new Cat(
            nestedName, nestedBreed, nestedAge, nestedWeight, nestedFurColour,
            nestedIsFemale, nestedIsMale, nestedIsDeclawed, nestedIsSpayed,
            nestedIsNeutered, nestedIsStray, nestedIsMicrochipped);
        }
    }
}
Advertisements

Posted on October 23, 2015, in Uncategorized. Bookmark the permalink. Leave a comment.

Leave a Reply

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: